//week15_multple_windows
void setup() { size(300,200); background(255,0,0); WindowB child = new WindowB();//WindowB做事 } void draw() { } class WindowB extends PApplet { public WindowB()//建構子constructor { super();//呼叫上一層建構子 PApplet.runSketch(new String[]{this.getClass().getName()},this); } public void settings() { size(300,200); } public void setup() { //size(200,200); background(0,255,0); } public void draw() { } }
//week15_02_multple_windows_PGraphics PGraphics pg; void setup() { size(400,400,P3D);//主要視窗 pg=createGraphics(200,200,P3D); } void draw() { background(255,0,0);//紅色背景 pg.beginDraw(); pg.background(0,255,0);//綠色小背景 pg.translate(100,100); pg.rotateY(radians(frameCount)); pg.box(100); pg.endDraw(); image(pg,0,0); }//week15_03_multple_windows_pg_pg2_pg3_pg4 //修改自week15_02_multple_windows_PGraphics PGraphics pg,pg2,pg3,pg4; void setup() { size(400,400,P3D);//主要視窗 pg=createGraphics(200,200,P3D); pg2=createGraphics(200,200,P3D); pg3=createGraphics(200,200,P3D); pg4=createGraphics(200,200,P3D); } void draw() { background(255,0,0);//紅色背景 pg.beginDraw(); pg.background(0,255,0);//綠色小背景 pg.translate(100,100); pg.rotateY(radians(frameCount)); pg.box(100); pg.endDraw(); pg2.beginDraw(); pg2.background(255,255,0);//黃色小背景 pg2.translate(100,100); pg2.rotateY(radians(frameCount)); pg2.box(100); pg2.endDraw(); pg3.beginDraw(); pg3.background(255,0,0);//紅色小背景 pg3.translate(100,100); pg3.rotateY(radians(frameCount)); pg3.box(100); pg3.endDraw(); pg4.beginDraw(); pg4.background(255,0,255);//紫色小背景 pg4.translate(100,100); pg4.rotateY(radians(frameCount)); pg4.box(100); pg4.endDraw(); image(pg,0,0); image(pg2,200,0); image(pg3,0,200); image(pg4,200,200); } //week15_04_multple_windows_pg_pg2_pg3_pg4_Arcball //修改自week15_03_multple_windows_pg_pg2_pg3_pg4 //偷Arcball從File>Example>Demos?>Tests>MultpleWindows PGraphics pg,pg2,pg3,pg4; Arcball arcball; void setup() { size(400,400,P3D);//主要視窗 arcball = new Arcball(this,200); pg=createGraphics(200,200,P3D); pg2=createGraphics(200,200,P3D); pg3=createGraphics(200,200,P3D); pg4=createGraphics(200,200,P3D); } void mousePressed() { arcball.mousePressed(); } void mouseDragged() { arcball.mouseDragged(); } void draw() { background(255,0,0);//紅色背景 //arcball.run(); pg.beginDraw(); pg.background(0,255,0);//綠色小背景 arcball.run(); //pg.translate(100,100); //pg.rotateY(radians(frameCount)); pg.box(100); pg.endDraw(); pg2.beginDraw(); pg2.background(255,255,0);//黃色小背景 pg2.translate(100,100); pg2.rotateY(radians(frameCount)); pg2.box(100); pg2.endDraw(); pg3.beginDraw(); pg3.background(255,0,0);//紅色小背景 pg3.translate(100,100); pg3.rotateY(radians(frameCount)); pg3.box(100); pg3.endDraw(); pg4.beginDraw(); pg4.background(255,0,255);//紫色小背景 pg4.translate(100,100); pg4.rotateY(radians(frameCount)); pg4.box(100); pg4.endDraw(); image(pg,0,0); image(pg2,200,0); image(pg3,0,200); image(pg4,200,200); }// week15_5_postman_mouseDragged_head_angle[0]_atan2 //修改自week11_3_postman_again // 重新來一次,讓程式的架構變更清楚 PImage postman, head, body, leftupuparm, leftuparm, rightupuparm, rightuparm, foot1, foot2; void setup(){ size(560,560); postman = loadImage("postman.png"); head = loadImage("head.png"); body = loadImage("body.png"); leftupuparm = loadImage("leftupuparm.png"); leftuparm = loadImage("leftuparm.png"); rightupuparm = loadImage("rightupuparm.png"); rightuparm = loadImage("rightuparm.png"); foot1 = loadImage("foot1.png"); foot2 = loadImage("foot2.png"); } void mouseDragged(){ //從void draw()找到掛的位置 236,231 float dx = mouseX-236,dy=mouseY-231; angleX[0]=degrees(atan2(dy,dx))+90; //把原本mouseX左右移動改成像IK的轉動 //angleX[ID] += mouseX - pmouseX; //angleY[ID] += mouseY - pmouseY; // 多了這一行 } int R = 0; void myInterpolate(){ if(lines.size() >= 2){ // 要有 2 行以上,才能做內插 float alpha = (frameCount%30)/30.0; // 介於 0.0~1.0 中間的值 if(alpha == 0.0) R = (R+1)%lines.size(); // 如果變到0.0,就換下一組 int R2 = (R+1)%lines.size(); float [] oldAngle = float(split( lines.get( R ),' ')); float [] newAngle = float(split( lines.get( R2 ),' ')); for(int i=0;i<10;i++){ angleX[i] = oldAngle[i*2+0]*(1-alpha) + newAngle[i*2+0]*alpha; angleY[i] = oldAngle[i*2+1]*(1-alpha) + newAngle[i*2+1]*alpha; } } } float [] angleX = new float[10]; // 在 3D 的世界裡面,我們的旋轉 float [] angleY = new float[10]; int ID = 0; // 一開始是頭的關節 ArrayList<String> lines = new ArrayList<String>(); void keyPressed(){ if(key == 's'){ String now = ""; //空字串 for(int i=0;i<10;i++){ now += angleX[i] + " "; // 後面有空格 now += angleY[i] + " "; // 後面有空格 } lines.add(now); // 把現在的動作的這行,加到 lines 裡面 String[] arr = new String[lines.size()]; lines.toArray(arr); saveStrings("angles.txt",arr); println("現在存檔:"+ now); } if(key == 'r'){ String [] file = loadStrings("angles.txt"); if(file != null){ for(int i=0; i<file.length; i++){ lines.add(file[i]); println("現在讀檔:" + file[i]); } } } if(key == 'p') playing = !playing; // 播動畫 <=> 不播動畫 if(key == '1') ID = 1; // 左上上臂 if(key == '2') ID = 2; // 左上臂 if(key == '3') ID = 3; // 右上上臂 if(key == '4') ID = 4; // 右上臂 if(key == '5') ID = 5; // (待用) if(key == '6') ID = 6; // (待用) if(key == '0') ID = 0; // 頭 } boolean playing = false; // 一開始,不播動畫,按下 'p' 可切換 void draw(){ background(#FFFFF2); if(playing) myInterpolate(); image(body, 0, 0); // 先畫身體 pushMatrix(); translate(+236, +231); // 再放回去正確的位置 rotate(radians(angleX[0])); translate(-236,-231); // 把頭的旋轉中心,放到(0,0) image(head, 0, 0); // 再畫頭 popMatrix(); pushMatrix(); translate(+185, +263); // 再放回去正確的位置 rotate(radians(angleX[1])); translate(-185,-263); image(leftupuparm, 0, 0); // 左上上手臂 pushMatrix(); translate(+118, +264); // 再放回去正確的位置 rotate(radians(angleX[2])); translate(-118,-264); image(leftuparm, 0, 0); // 左上手臂 popMatrix(); popMatrix(); pushMatrix(); translate(+290, +263); // 再放回去正確的位置 rotate(radians(angleX[3])); translate(-290,-263); image(rightupuparm, 0, 0); // 右上上手臂 pushMatrix(); translate(+356, +259); // 再放回去正確的位置 rotate(radians(angleX[4])); translate(-356,-259); image(rightuparm, 0, 0); // 右上手臂 popMatrix(); popMatrix(); pushMatrix(); translate(220,375); rotate(radians(angleX[5])); translate(-220,-375); image(foot1,0,0); popMatrix(); pushMatrix(); translate(261,372); rotate(radians(angleX[6])); translate(-261,-372); image(foot2,0,0); popMatrix(); }// week15_6_postman_mouseDragged_posX_posY_angleX_ID_atan2 //修改自week15_5_postman_mouseDragged_head_angle[0]_atan2 // 重新來一次,讓程式的架構變更清楚 PImage postman, head, body, leftupuparm, leftuparm, rightupuparm, rightuparm, foot1, foot2; void setup(){ size(560,560); postman = loadImage("postman.png"); head = loadImage("head.png"); body = loadImage("body.png"); leftupuparm = loadImage("leftupuparm.png"); leftuparm = loadImage("leftuparm.png"); rightupuparm = loadImage("rightupuparm.png"); rightuparm = loadImage("rightuparm.png"); foot1 = loadImage("foot1.png"); foot2 = loadImage("foot2.png"); } boolean playing = false; // 一開始,不播動畫,按下 'p' 可切換 float [] posX={236,185,116,290,357,220,260}; float [] posY={231,261,265,262,259,375,372}; float [] posAngle = {90,180,180,0,0,-90,-90}; void mouseDragged(){ //從void draw()找到掛的位置 236,231 //float dx = mouseX-236,dy=mouseY-231; //angleX[0]=degrees(atan2(dy,dx))+90; //把原本mouseX左右移動改成像IK的轉動 //angleX[ID] += mouseX - pmouseX; //angleY[ID] += mouseY - pmouseY; // 多了這一行 float dx = mouseX-posX[ID],dy=mouseY-posY[ID]; angleX[ID]=degrees(atan2(dy,dx))+posAngle[ID]; } int R = 0; void myInterpolate(){ if(lines.size() >= 2){ // 要有 2 行以上,才能做內插 float alpha = (frameCount%30)/30.0; // 介於 0.0~1.0 中間的值 if(alpha == 0.0) R = (R+1)%lines.size(); // 如果變到0.0,就換下一組 int R2 = (R+1)%lines.size(); float [] oldAngle = float(split( lines.get( R ),' ')); float [] newAngle = float(split( lines.get( R2 ),' ')); for(int i=0;i<10;i++){ angleX[i] = oldAngle[i*2+0]*(1-alpha) + newAngle[i*2+0]*alpha; angleY[i] = oldAngle[i*2+1]*(1-alpha) + newAngle[i*2+1]*alpha; } } } float [] angleX = new float[10]; // 在 3D 的世界裡面,我們的旋轉 float [] angleY = new float[10]; int ID = 0; // 一開始是頭的關節 ArrayList<String> lines = new ArrayList<String>(); void keyPressed(){ if(key == 's'){ String now = ""; //空字串 for(int i=0;i<10;i++){ now += angleX[i] + " "; // 後面有空格 now += angleY[i] + " "; // 後面有空格 } lines.add(now); // 把現在的動作的這行,加到 lines 裡面 String[] arr = new String[lines.size()]; lines.toArray(arr); saveStrings("angles.txt",arr); println("現在存檔:"+ now); } if(key == 'r'){ String [] file = loadStrings("angles.txt"); if(file != null){ for(int i=0; i<file.length; i++){ lines.add(file[i]); println("現在讀檔:" + file[i]); } } } if(key == 'p') playing = !playing; // 播動畫 <=> 不播動畫 if(key == '1') ID = 1; // 左上上臂 if(key == '2') ID = 2; // 左上臂 if(key == '3') ID = 3; // 右上上臂 if(key == '4') ID = 4; // 右上臂 if(key == '5') ID = 5; // (待用) if(key == '6') ID = 6; // (待用) if(key == '0') ID = 0; // 頭 } void draw(){ background(#FFFFF2); if(playing) myInterpolate(); image(body, 0, 0); // 先畫身體 pushMatrix(); translate(+236, +231); // 再放回去正確的位置 rotate(radians(angleX[0])); translate(-236,-231); // 把頭的旋轉中心,放到(0,0) image(head, 0, 0); // 再畫頭 popMatrix(); pushMatrix(); translate(+185, +263); // 再放回去正確的位置 rotate(radians(angleX[1])); translate(-185,-263); image(leftupuparm, 0, 0); // 左上上手臂 pushMatrix(); translate(+118, +264); // 再放回去正確的位置 rotate(radians(angleX[2])); translate(-118,-264); image(leftuparm, 0, 0); // 左上手臂 popMatrix(); popMatrix(); pushMatrix(); translate(+290, +263); // 再放回去正確的位置 rotate(radians(angleX[3])); translate(-290,-263); image(rightupuparm, 0, 0); // 右上上手臂 pushMatrix(); translate(+356, +259); // 再放回去正確的位置 rotate(radians(angleX[4])); translate(-356,-259); image(rightuparm, 0, 0); // 右上手臂 popMatrix(); popMatrix(); pushMatrix(); translate(220,375); rotate(radians(angleX[5])); translate(-220,-375); image(foot1,0,0); popMatrix(); pushMatrix(); translate(261,372); rotate(radians(angleX[6])); translate(-261,-372); image(foot2,0,0); popMatrix(); }更絲滑的轉動
沒有留言:
張貼留言