2025年4月17日 星期四

晚安week09

  。組裝鋼彈模型

1.上周的程式碼
//week09_01_gundam_head
PShape body, head;
void setup() {
   size(400, 400, P3D);
   body = loadShape("body.obj");
   head = loadShape("head.obj");
 }
void draw() {
   background(255);
   translate(width/2, height/2+100);
   sphere(5);//原點點
   scale(10, -10, 10);
   shape(head, 0, 0);
   shape(body, 0, 0);
 }

加上T-R-T
//week09_02_gundam_head_puh_TRT_pop

PShape body, head;
void setup() {
   size(400, 400, P3D);
   body = loadShape("body.obj");
   head = loadShape("head.obj");
 }
  void draw() {
   background(255);
   translate(width/2, height/2+100);
   sphere(5);//原點點
      scale(10, -10, 10);
      shape(body, 0, 0);
   pushMatrix();
     translate(0, 22.5);
     rotateY(radians(mouseX-200));
     rotateX(radians(mouseY-50));
     translate(0, -22.5);
     shape(head, 0, 0);
   popMatrix();
 }
float x=0, y=0;
void mouseDragged() {
   x+= mouseX - pmouseX;
   y+= mouseY - pmouseY;
   print(x/10,y/10);
 }
執行結果:











2.組裝上臂
//week09_03_gundam_uparm_upuparm
PShape uparm1,upuparm1;
void setup() {
  size(400, 400, P3D);
  uparm1 = loadShape("uparm1.obj");
  upuparm1 = loadShape("upuparm1.obj");
}
void draw() {
  background(255);
  translate(width/2, height/2+100);
  sphere(5);//原點點
  
  scale(10, -10, 10);
  
  shape(upuparm1, 0, 0);//上上臂
  pushMatrix();
    translate(-4.1,19.9);
    rotateX(radians(mouseY-100));
    translate(4.1,-19.9);
    //translate(mouseX/10.0, -mouseY/10.0);//移動,尋找適合的座標
    //println(mouseX/10.0, -mouseY/10.0);//印出座標
    shape(uparm1, 0, 0);//上臂
  popMatrix();
}
執行結果:

3.組裝上臂+手
//week09_04_gundam_uparm_upuparm_hand
PShape uparm1,upuparm1,hand1;
void setup() {
  size(400, 400, P3D);
  uparm1 = loadShape("uparm1.obj");
  upuparm1 = loadShape("upuparm1.obj");
  hand1 = loadShape("hand1.obj");
}
void draw() {
  background(255);
  translate(width/2, height/2+100);
  sphere(5);//原點點
  
  scale(10, -10, 10);
  
  shape(upuparm1, 0, 0);//上上臂
  pushMatrix();
    translate(-4.1,19.9);
    //rotateX(radians(mouseY-100));
    translate(4.1,-19.9);
    //translate(mouseX/10.0, -mouseY/10.0);//移動,尋找適合的座標
    //println(mouseX/10.0, -mouseY/10.0);//印出座標
    shape(uparm1, 0, 0);//上臂
    pushMatrix();
      translate(-4.5,17.5);
      rotateX(radians(mouseY-100));
      
      translate(4.5,-17.5);
      //translate(mouseX/10.0, -mouseY/10.0);//移動,尋找適合的座標
      //println(mouseX/10.0, -mouseY/10.0);//印出座標
     shape(hand1, 0, 0);//手
    popMatrix();
  popMatrix();
}

執行結果:











  

。關節&鍵盤滑鼠事件
4.利用鍵盤事件切換要旋轉的關節+滑鼠拖曳X軸旋轉角度
//week09_05_gundam_uparm_upuparm_hand_keyboard_mouse_angle
PShape uparm1,upuparm1,hand1;
void setup() {
  size(400, 400, P3D);
  uparm1 = loadShape("uparm1.obj");
  upuparm1 = loadShape("upuparm1.obj");
  hand1 = loadShape("hand1.obj");
}
float []angle = new float[20];//20個關節角度
int ID = 0; //用來指定關節的代碼,angle[ID]的資料會儲存旋轉的角度
void keyPressed(){
  if(key=='1') ID = 1; //按下鍵盤1指定到第一個關節(肩膀)
  if(key=='2') ID = 2; //按下鍵盤2指定到第二個關節(手肘)
}
void mouseDragged(){
  angle[ID] += mouseX - pmouseX;//X軸的移動 改變關節角度
}
void draw() {
  background(255);
  translate(width/2, height/2+100);
  sphere(5);//原點
  
  scale(10, -10, 10);
  
  shape(upuparm1, 0, 0);//上上臂
  pushMatrix();
    translate(-4.1,19.9);
    rotateZ(radians(angle[1]));
    translate(4.1,-19.9);
    //translate(mouseX/10.0, -mouseY/10.0);//移動,尋找適合的座標
    //println(mouseX/10.0, -mouseY/10.0);//印出座標
    shape(uparm1, 0, 0);//上臂
    pushMatrix();
      translate(-4.5,17.5);
        rotateX(radians(angle[2]));
      translate(4.5,-17.5);
      //translate(mouseX/10.0, -mouseY/10.0);//移動,尋找適合的座標
      //println(mouseX/10.0, -mouseY/10.0);//印出座標
     shape(hand1, 0, 0);//手
    popMatrix();
  popMatrix();
}
執行結果:    













  
。存檔&讀檔
5.把移動,旋轉的紀錄存檔後再讀取,做成動畫
//week09_06_saveStings_loadStrings
void setup(){
  size(300,300);
  rect(10,10,80,80);
  rect(110,110,80,80);
  save("file.png");
  another = loadStrings("lines.txt");//如果沒有檔案會指定為空指標
}
int x = 10, y=10, ID=0;
void draw(){
  background(204);
  if(another != null){
    int [] now = int(split(another[ID],' '));//整數陣列,將another(字串陣列)裡的資料轉換、分割
    rect(now[0],now[1],80,80);//now是現在從another陣列裡讀進的座標
    ID=(ID+1) % another.length; //指定為陣列中的第ID筆資料
    //draw函式本身以每秒60次的速度運行,ID會自動每幀+1
  }
  rect(x,y,80,80);
}
void mouseDragged(){
  x += mouseX - pmouseX;
  y += mouseY - pmouseY;
  //String now = x + " " + y;//儲存現在座標的字串
  lines.add(x + " " + y); //println(now);//在陣列裡新增字串
}
ArrayList<String> lines = new ArrayList<String>();//JAVA的list陣列
String[] another; //讀進來的字串
void keyPressed(){
  String[] arr = new String[lines.size()];//宣告字串,大小為陣列line的大小
  lines.toArray(arr);//把陣列轉換儲存為字串
  if(key=='s')  saveStrings("lines.txt", arr);//按下鍵盤s鍵儲存為"lines.txt"
}

save("檔名")可以儲存視窗畫面為圖檔
saveStrings("檔名", 字串)將字串儲存為文字檔 loadStrings("檔名");在速寫本中讀進檔案
執行結果:









讀進資料的部分:

沒有留言:

張貼留言