2025年5月29日 星期四

week15

 

//week15-1

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

  }

  public void draw(){

  }

}

//week15-2

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

//修改自week15-2

PGraphics pg1,pg2,pg3,pg4;

void setup(){

  size(400,400,P3D);//主視窗

  pg1=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);//紅色大背景

   pg1.beginDraw();

   pg1.background(0,255,0);//綠色小背景

   pg1.translate(100,100);

   pg1.rotateY(radians(frameCount));

   pg1.box(100);

   pg1.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(0,255,255);//綠色小背景

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

   image(pg2,200,0);

   image(pg3,0,200);

   image(pg4,200,200);

}


//week15-4

//修改自week15-3

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

   //pg1.translate(100,100);

   //pg1.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(0,255,255);//綠色小背景

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

}

// Ariel and V3ga's arcball class with a couple tiny mods by Robert Hodgin

class Arcball {
  PApplet parent;
  float center_x, center_y, radius;
  Vec3 v_down, v_drag;
  Quat q_now, q_down, q_drag;
  Vec3[] axisSet;
  int axis;
  float mxv, myv;
  float x, y;
  
  Arcball(PApplet parent, float radius){
    this.parent = parent;
    this.radius = radius;

    v_down = new Vec3();
    v_drag = new Vec3();

    q_now = new Quat();
    q_down = new Quat();
    q_drag = new Quat();

    axisSet = new Vec3[] {new Vec3(1.0f, 0.0f, 0.0f), new Vec3(0.0f, 1.0f, 0.0f), new Vec3(0.0f, 0.0f, 1.0f)};
    axis = -1;  // no constraints...    
  }

  void mousePressed(){
    v_down = mouse_to_sphere(parent.mouseX, parent.mouseY);
    q_down.set(q_now);
    q_drag.reset();
  }

  void mouseDragged(){
    v_drag = mouse_to_sphere(parent.mouseX, parent.mouseY);
    q_drag.set(Vec3.dot(v_down, v_drag), Vec3.cross(v_down, v_drag));
  }

  void run(){
    center_x = 100;
    center_y = 100;
    
    q_now = Quat.mul(q_drag, q_down);
    pg.translate(center_x, center_y);
    applyQuat2Matrix(q_now);
    
    x += mxv;
    y += myv;
    mxv -= mxv * .01;
    myv -= myv * .01;
  }
  
  Vec3 mouse_to_sphere(float x, float y){
    Vec3 v = new Vec3();
    v.x = (x - center_x) / radius;
    v.y = (y - center_y) / radius;

    float mag = v.x * v.x + v.y * v.y;
    if (mag > 1.0f){
      v.normalize();
    } else {
      v.z = sqrt(1.0f - mag);
    }

    return (axis == -1) ? v : constrain_vector(v, axisSet[axis]);
  }

  Vec3 constrain_vector(Vec3 vector, Vec3 axis){
    Vec3 res = new Vec3();
    res.sub(vector, Vec3.mul(axis, Vec3.dot(axis, vector)));
    res.normalize();
    return res;
  }

  void applyQuat2Matrix(Quat q){
    // instead of transforming q into a matrix and applying it...

    float[] aa = q.getValue();
    pg.rotate(aa[0], aa[1], aa[2], aa[3]);
  }
}

static class Vec3{
  float x, y, z;

  Vec3(){
  }

  Vec3(float x, float y, float z){
    this.x = x;
    this.y = y;
    this.z = z;
  }

  void normalize(){
    float length = length();
    x /= length;
    y /= length;
    z /= length;
  }

  float length(){
    return (float) Math.sqrt(x * x + y * y + z * z);
  }

  static Vec3 cross(Vec3 v1, Vec3 v2){
    Vec3 res = new Vec3();
    res.x = v1.y * v2.z - v1.z * v2.y;
    res.y = v1.z * v2.x - v1.x * v2.z;
    res.z = v1.x * v2.y - v1.y * v2.x;
    return res;
  }

  static float dot(Vec3 v1, Vec3 v2){
    return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
  }
  
  static Vec3 mul(Vec3 v, float d){
    Vec3 res = new Vec3();
    res.x = v.x * d;
    res.y = v.y * d;
    res.z = v.z * d;
    return res;
  }

  void sub(Vec3 v1, Vec3 v2){
    x = v1.x - v2.x;
    y = v1.y - v2.y;
    z = v1.z - v2.z;
  }
}

static class Quat{
  float w, x, y, z;

  Quat(){
    reset();
  }

  Quat(float w, float x, float y, float z){
    this.w = w;
    this.x = x;
    this.y = y;
    this.z = z;
  }

  void reset(){
    w = 1.0f;
    x = 0.0f;
    y = 0.0f;
    z = 0.0f;
  }

  void set(float w, Vec3 v){
    this.w = w;
    x = v.x;
    y = v.y;
    z = v.z;
  }

  void set(Quat q){
    w = q.w;
    x = q.x;
    y = q.y;
    z = q.z;
  }

  static Quat mul(Quat q1, Quat q2){
    Quat res = new Quat();
    res.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z;
    res.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y;
    res.y = q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z;
    res.z = q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x;
    return res;
  }
  
  float[] getValue(){
    // transforming this quat into an angle and an axis vector...

    float[] res = new float[4];

    float sa = (float) Math.sqrt(1.0f - w * w);
    if (sa < EPSILON){
      sa = 1.0f;
    }

    res[0] = (float) Math.acos(w) * 2.0f;
    res[1] = x / sa;
    res[2] = y / sa;
    res[3] = z / sa;

    return res;
  }
}


//week15-5

//week11-3

PImage postman, head, body, uparm1, hand1, uparm2, hand2,foot1,foot2;

void setup(){

  size(500,500);

  postman=loadImage("postman.png");

  head=loadImage("head.png");

  body=loadImage("body.png");

  uparm1=loadImage("uparm1.png");

  hand1=loadImage("hand1.png");

  uparm2=loadImage("uparm2.png");

  hand2=loadImage("hand2.png");

  foot1=loadImage("foot1.png");//131 274

  foot2=loadImage("foot2.png");//152 274

}

float[] angleX=new float[10];

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

    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=='7') ID=7;// 頭

}

boolean playing=false;//一開始不播,按p可切換

void mouseDragged(){

  //從void draw()找到頭掛的位置

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

  image(body, 0, 0); // 再畫身體

  image(head, 0, 0);

  pushMatrix();

    translate(131,274);

    rotate(radians(angleX[5]));

    translate(-131,-274);

    image(foot1,0,0);

 popMatrix();

 pushMatrix();

    translate(152,274);

    rotate(radians(angleX[6]));

    translate(-152,-274);

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

}

float[]posX={+185,+116,290,357,131};

float[]posY={+261,+265,262,259,274};


//week15-6

//week11-3

PImage postman, head, body, uparm1, hand1, uparm2, hand2,foot1,foot2;

void setup(){

  size(500,500);

  postman=loadImage("postman.png");

  head=loadImage("head.png");

  body=loadImage("body.png");

  uparm1=loadImage("uparm1.png");

  hand1=loadImage("hand1.png");

  uparm2=loadImage("uparm2.png");

  hand2=loadImage("hand2.png");

  foot1=loadImage("foot1.png");//131 274

  foot2=loadImage("foot2.png");//152 274

}

float[] angleX=new float[10];

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

    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=='7') ID=7;// 頭

}

boolean playing=false;//一開始不播,按p可切換

float[]posX={+185,+116,290,357,131};

float[]posY={+261,+265,262,259,274};

float[] posAngle={90,180,180,0,0,-90,-90};

void mouseDragged(){

  //從void draw()找到頭掛的位置

  //float dx=mouseX-236,dy=mouseY-231;

  //angleX[0]=degrees(atan2(dy,dx))+90;

  float dx=mouseX-posX[ID],dy=mouseY-posY[ID];

  angleX[ID]=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);

  image(body, 0, 0); // 再畫身體

  image(head, 0, 0);

  pushMatrix();

    translate(131,274);

    rotate(radians(angleX[5]));

    translate(-131,-274);

    image(foot1,0,0);

 popMatrix();

 pushMatrix();

    translate(152,274);

    rotate(radians(angleX[6]));

    translate(-152,-274);

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

}


沒有留言:

張貼留言