2025年5月29日 星期四

week15_呱

//week15-1

//File > Example > Demo > Test > MultipleWindows

void setup(){

 size(300,200);

 background(255,0,0);

 WindowB child = new 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);

  }

  void draw(){ //空白的,要放

  

  }

}

 


//week15-2_multiple_window_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-3_multiple_windows_pg1_pg2_pg3_pg4

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(0,0,255);

  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,255,0);

  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-4

//修改自week15-3_multiple_windows_pg1_pg2_pg3_pg4

//偷Arcball從File > Example > Demo > Test > MultipleWindows

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);

  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(0,0,255);

  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,255,0);

  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_angle0
//修改自week11-3_postman_again
PImage postman, head, body, uparm1, hand1, uparm2, hand2,foot1,foot2;
void setup(){
  size(560, 560);
  postman = loadImage("postman.png");
  head = loadImage("head.png");
  body = loadImage("body.png");
  uparm1 = loadImage("arm1.png");
  hand1 = loadImage("hand1.png");
  uparm2 = loadImage("arm2.png");
  hand2 = loadImage("hand2.png");
  foot1= loadImage("foot1.png");
  foot2= loadImage("foot2.png");
}
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') { // replay, 照著之前按 's' 存檔的 lines 重播一次
      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; //一開始,不播動畫

void mouseDragged() {
  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){
      float alpha=(frameCount%30)/30.0;
      if(alpha==0.0) R=(R+1)%lines.size();
      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;
      }
   }
}

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(); //腳 foot
    translate(+220, +375);
    rotate(radians(angleX[5]));
    translate(-220, -375);
    image(foot1, 0, 0);
  popMatrix();
  pushMatrix();
    translate(+260, +372);
    rotate(radians(angleX[6]));
    translate(-260, -372);
    image(foot2, 0, 0);
  popMatrix();
  
   pushMatrix(); // 要畫左邊的上手臂、手肘
    translate(+185, +261);
    rotate(radians(angleX[1]));
    translate(-185, -261);
  image(uparm1, 0, 0); // 上手臂
  pushMatrix();
    translate(+116, +265);
    rotate(radians(angleX[2]));
    translate(-116, -265);
    image(hand1, 0, 0);
  popMatrix();
  popMatrix();

  pushMatrix(); // 要畫右邊的上手臂、手肘
    translate(290, 262);
    rotate(radians(angleX[3]));
    translate(-290, -262);
    image(uparm2, 0, 0);
  pushMatrix();
    translate(357, 259);
    rotate(radians(angleX[4]));
    translate(-357, -259);
    image(hand2, 0, 0);
  popMatrix();
  popMatrix();
  
  
}




//week15-6_postman_mouseDragged_angle0
//修改自week11-3_postman_again
PImage postman, head, body, uparm1, hand1, uparm2, hand2,foot1,foot2;
void setup(){
  size(560, 560);
  postman = loadImage("postman.png");
  head = loadImage("head.png");
  body = loadImage("body.png");
  uparm1 = loadImage("arm1.png");
  hand1 = loadImage("hand1.png");
  uparm2 = loadImage("arm2.png");
  hand2 = loadImage("hand2.png");
  foot1= loadImage("foot1.png");
  foot2= loadImage("foot2.png");
}
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') { // replay, 照著之前按 's' 存檔的 lines 重播一次
      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; //一開始,不播動畫
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() {
  //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){
      float alpha=(frameCount%30)/30.0;
      if(alpha==0.0) R=(R+1)%lines.size();
      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;
      }
   }
}

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(); //腳 foot
    translate(+220, +375);
    rotate(radians(angleX[5]));
    translate(-220, -375);
    image(foot1, 0, 0);
  popMatrix();
  pushMatrix();
    translate(+260, +372);
    rotate(radians(angleX[6]));
    translate(-260, -372);
    image(foot2, 0, 0);
  popMatrix();
  
   pushMatrix(); // 要畫左邊的上手臂、手肘
    translate(+185, +261);
    rotate(radians(angleX[1]));
    translate(-185, -261);
  image(uparm1, 0, 0); // 上手臂
  pushMatrix();
    translate(+116, +265);
    rotate(radians(angleX[2]));
    translate(-116, -265);
    image(hand1, 0, 0);
  popMatrix();
  popMatrix();

  pushMatrix(); // 要畫右邊的上手臂、手肘
    translate(290, 262);
    rotate(radians(angleX[3]));
    translate(-290, -262);
    image(uparm2, 0, 0);
  pushMatrix();
    translate(357, 259);
    rotate(radians(angleX[4]));
    translate(-357, -259);
    image(hand2, 0, 0);
  popMatrix();
  popMatrix();
  
  
}





沒有留言:

張貼留言