int count=0; // キーフレームでの位置・大きさ・色 float[] keyX = new float[4]; float[] keyY = new float[4]; float[] keyD = new float[4]; float[] keyCr = new float[4]; float[] keyCg = new float[4]; float[] keyCb = new float[4]; // 各フレームでの位置・大きさ・色 PVector[] p = new PVector[91]; float[] d = new float[91]; color[] c = new color[91]; void setup() { size(600, 400); // キーフレームでの値をランダムに決める for (int i=0; i<4; i++) { keyX[i] = random(20, width-20); keyY[i] = random(20, height-20); keyD[i] = random(20, 80); keyCr[i] = random(256); keyCg[i] = random(256); keyCb[i] = random(256); } // それ以外のフレームでの値を補間 for (int i=0; i<=90; i++) { float r = i/30.0; p[i] = new PVector(ip(keyX, r), ip(keyY, r)); d[i] = ip(keyD, r); c[i] = color(ip(keyCr, r),ip(keyCg, r),ip(keyCb, r)); } } // 線形補間 float ip(float[] key, float r) { if (r<1) { return key[0]*(1-r)+key[1]*r; } else if (r<2){ return key[1]*(1-(r-1))+key[2]*(r-1); } else { return key[2]*(1-(r-2))+key[3]*(r-2); } } void draw() { // キーフレームの円(枠)を表示 background(0); noFill(); for (int i=0; i<4; i++) { stroke(keyCr[i], keyCg[i], keyCb[i]); ellipse(keyX[i], keyY[i], keyD[i], keyD[i]); } // 補間した円を表示 fill(c[count]); noStroke(); ellipse(p[count].x, p[count].y, d[count], d[count]); save("課題1/"+nf(count, 2)); if (count>=90) { exit(); } count++; }
// 3次関数による補間 float ip(float[] key, float r) { float[][] mt ={ {-1.0/6, 0.5, -0.5, 1.0/6}, {1, -2.5, 2, -0.5}, {-11.0/6, 3, -1.5, 1.0/3}, {1, 0, 0, 0} }; float a=key[0]*mt[0][0]+key[1]*mt[0][1]+key[2]*mt[0][2]+key[3]*mt[0][3]; float b=key[0]*mt[1][0]+key[1]*mt[1][1]+key[2]*mt[1][2]+key[3]*mt[1][3]; float c=key[0]*mt[2][0]+key[1]*mt[2][1]+key[2]*mt[2][2]+key[3]*mt[2][3]; float d=key[0]*mt[3][0]+key[1]*mt[3][1]+key[2]*mt[3][2]+key[3]*mt[3][3]; return a*r*r*r+b*r*r+c*r+d; }
int count=0; // オブジェクトの位置・形・色 PVector[] bPos = new PVector[20]; PVector[] bSize = new PVector[20]; color[] c = new color[20]; void setup() { size(600, 400, P3D); stroke(255); // オブジェクトの位置・形・色をランダムに決める for (int i=0; i<bPos.length; i++) { bSize[i] = new PVector(0, 0, 0); bSize[i].x = random(20, 100); bSize[i].y = random(20, 300); bSize[i].z = random(20, 100); bPos[i] = new PVector(0, 0, 0); bPos[i].x = random(width); bPos[i].y = height-bSize[i].y/2; bPos[i].z = random(-3000, -100); c[i] = color(random(256), random(256), random(256)); } } void draw() { background(0); perspective(radians(95-count), (float)width/height, 1, 4000); // 画角 for (int i=0; i<bPos.length; i++) { fill(c[i]); translate(bPos[i].x, bPos[i].y, bPos[i].z); box(bSize[i].x, bSize[i].y, bSize[i].z); translate(-bPos[i].x, -bPos[i].y, -bPos[i].z); } save("課題3/"+nf(count, 2)); if (count>=90) { exit(); } count++; }
PVector dc = new PVector(width/2.0, height/2.0, height/2.0/tan(PI/6)); // デフォルトのカメラ位置 camera(dc.x, dc.y, dc.z-count*20, dc.x, dc.y, -5000, 0, 1, 0); // カメラ位置、注視位置、画面上方向