Interactive Mask
人が働きかけるのは、マウスのx座標というひとつの値です。それを目の大きさや顔の幅などのさまざまな値と連動させます。
その計算をするのがmap()関数です。例えば、mouseXの値を18-60の間の値に変換し、目の幅として使い、mouseXの値を10-35の間の値に変換し、目の高さに使っています。
eyeW = map(mouseX, 0, width, 18, 60); eyeH = map(mouseX, 0, width, 10, 35);この目の幅と高さは、quad()関数で目のひし形の輪郭を描く時に使われています。(eyeX1, eyeY)が目玉の中心座標。
//左目 ↓左端の点 ↓上端の点 ↓右端の点 ↓下端の点 quad(eyeX1-eyeW/2, eyeY, eyeX1, eyeY-eyeH/2, eyeX1+eyeW/2, eyeY, eyeX1, eyeY+eyeH/2);
【リストFace1】 float eyeD; //目玉の大きさ float eyeH; //目の高さ float eyeW; //目の幅 float eyeX1, eyeX2; //目の中央のx座標 固定 float eyeY = 25; //目の中央のy座標 固定 float mX; //口の中央x位置 固定 float mY = 110; //口の中央y位置 固定 float mW = 75; //口の幅 固定 float mUH ; //上口の高さ float mDH ; //上口の高さ void setup() { size(150, 150); // 描画するための画面 noFill(); strokeWeight(2); //円の太さは2ピクセル stroke(200, 0, 0); //円の線の色は赤 eyeX1 = width/2 - 30; // 左目の中央 eyeX2 = width/2 + 30; // 右目の中央 mX = width/2; strokeJoin(ROUND); //線と線のつながり部分をラウンドにする } void draw() { background(255); //mouseXの値を18-60の間の値に変換し、目の幅にする eyeW = map(mouseX, 0, width, 18, 60); //mouseXの値を10-35の間の値に変換し、目の高さにする eyeH = map(mouseX, 0, width, 10, 35); //mouseXの値を3-30の間の値に変換し、目玉の直径にする eyeD = map(mouseX, 0, width, 3, 30); quad(eyeX1-eyeW/2, eyeY, eyeX1, eyeY-eyeH/2, eyeX1+eyeW/2, eyeY, eyeX1, eyeY+eyeH/2); //左目 quad(eyeX2-eyeW/2, eyeY, eyeX2, eyeY-eyeH/2, eyeX2+eyeW/2, eyeY, eyeX2, eyeY+eyeH/2); //右目 fill(200, 0, 0); ellipse(eyeX1, eyeY, eyeD, eyeD); //目玉 ellipse(eyeX2, eyeY, eyeD, eyeD); noFill(); line(eyeX1+eyeW/2, eyeY,eyeX2-eyeW/2, eyeY); //mouseXの値を5-10の間の値に変換し、上口の高さにする mUH = map(mouseX, 0, width, 5, 10); //mouseXの値を5-30の間の値に変換し、下口の高さにする mDH = map(mouseX, 0, width, 5, 30); quad(eyeX1, mY, eyeX1+eyeW/2, mY-mUH, eyeX2-eyeW/2, mY-mUH, eyeX2, mY); //上口 line(eyeX1-eyeW/2, eyeY,eyeX1-eyeW/2,mY-mUH);//左目下の線 左 line(eyeX1, eyeY+eyeH/2, eyeX1, mY); //左目下の線 中央 line(eyeX1+eyeW/2, eyeY,eyeX1+eyeW/2, mY-mUH); //左目下の線 右 line(eyeX2-eyeW/2, eyeY,eyeX2-eyeW/2, mY-mUH); //右目下の線 左 line( eyeX2, eyeY+eyeH/2, eyeX2, mY); //右目下の線 中央 line(eyeX2+eyeW/2, eyeY, eyeX2+eyeW/2, mY-mUH);//右目下の線 右 line(eyeX2, mY, eyeX2+eyeW/2, mY-mUH);//右目下の線 右斜め line(eyeX1, mY ,eyeX1-eyeW/2,mY-mUH); //左目下の線 左斜め quad(eyeX1, mY, eyeX2, mY,eyeX2-eyeW/2, mY+mDH, eyeX1+eyeW/2, mY+mDH); //下口 }