2025年4月17日 星期四

12750211-week09

 1.載入 Gundam 頭部和身體的模型,並畫出來

//week09-1_gundam_head_body

PShape body,head;
void setup(){
  size(400,400,P3D); // 開 3D 畫布
  body=loadShape("body.obj"); // 載入身體模型
  head=loadShape("head.obj"); // 載入頭部模型
}

void draw(){
  background(204); // 灰色背景
  translate(200,300); // 移動畫面中心點
  sphere(10); // 畫一顆球當參考點
  
  scale(10,-10,10); // 放大並翻轉 y 軸
  shape(body,0,0); // 畫身體
  shape(head,0,0); // 畫頭部
}

2.頭部可以隨滑鼠旋轉
//week09-2_gundam_head_body_push_trt_pop
PShape body,head;
void setup(){
  size(400,400,P3D);
  body=loadShape("body.obj");
  head=loadShape("head.obj");
}

void draw(){
  background(204);
  translate(200,300);
  sphere(10);
  
  scale(10,-10,10);
  shape(body,0,0);
  // 多了 pushMatrix/popMatrix 來控制頭部的轉動範圍
  pushMatrix(); // 保存目前變換狀態
    translate(0,22.5); // 先移到旋轉中心
    rotateY(radians(mouseX-200)); // 隨滑鼠 X 轉動 左右
    rotateX(radians(mouseY-60)); // 隨滑鼠 Y 轉動 上下
    translate(0,-22.5); // 移回來
    shape(head,0,0); // 畫頭
  popMatrix(); // 還原狀態

}
3.上臂可以隨滑鼠 Y 旋轉
//week09-3_gundam_uparm_upuparm
PShape uparm1,upuparm1;
void setup(){
  size(400,400,P3D);
  uparm1=loadShape("uparm1.obj");
  upuparm1=loadShape("upuparm1.obj");
}

void draw(){
  background(204);
  translate(200,300);
  sphere(3);
  
  scale(10,-10,10);
  shape(upuparm1,0,0); // 畫上上臂(固定)
  pushMatrix(); // 開始轉動的部分
    translate(-4.1,19.9); // 轉軸位置
    rotateX(radians(mouseY)); // 隨滑鼠 Y 轉動
    translate(4.1,-19.9);

   /*     translate(mouseX/10.0,-mouseY/10.0);//移動找到數值     println(mouseX/10.0,-mouseY/10.0);//印出數值 4.1,-19.9     */      shape(uparm1,0,0); // 畫上臂
  popMatrix();// 結束轉動
}
4.上臂與手臂可分別控制轉動
//week09-4_gundam_uparm_upuparm_hand_push_trt_pop
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(204);
  translate(200,300);
  sphere(3);
  
  scale(10,-10,10);
  shape(upuparm1,0,0);
  pushMatrix();
     translate(-4.1,19.9);
     rotateZ(radians(mouseX));
     translate(4.1,-19.9);
   /* 
    translate(mouseX/10.0,-mouseY/10.0);//移動找到數值
    println(mouseX/10.0,-mouseY/10.0);//印出數值 4.1,-19.9
    */
     shape(uparm1,0,0);
     pushMatrix();
       translate(-4.5,16.9);
       rotateX(radians(mouseX));
       translate(4.5,-16.9);// 手移到座標中心
       //translate(mouseX/10.0,-mouseY/10.0);
       //println(mouseX/10.0,-mouseY/10.0);
       shape(hand1,0,0);
     popMatrix();
  popMatrix();
}
5.用鍵盤選擇部位,滑鼠改變角度
//week09_5_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;
  if(key=='2') ID=2;
}
void mouseDragged(){
  angle[ID]+=mouseX-pmouseX;// X方向移動,改變某關節角度
} void draw(){   background(204);   translate(200,300);   sphere(3);      scale(10,-10,10);   shape(upuparm1,0,0);   pushMatrix();      translate(-4.1,19.9);      rotateZ(radians(angle[1]));// 按鍵盤1 再按滑鼠可以轉動
     translate(4.1,-19.9);    /*     translate(mouseX/10.0,-mouseY/10.0);//移動找到數值     println(mouseX/10.0,-mouseY/10.0);//印出數值 4.1,-19.9     */      shape(uparm1,0,0);      pushMatrix();        translate(-4.5,16.9);        rotateX(radians(angle[2]));// 按鍵盤2 再按滑鼠可以轉動
       translate(4.5,-16.9);        //translate(mouseX/10.0,-mouseY/10.0);        //println(mouseX/10.0,-mouseY/10.0);        shape(hand1,0,0);      popMatrix();   popMatrix(); }


6.可以拖動方塊,儲存軌跡成文字檔,再讀檔回放
//week09_6_save_saveStrings_loadStrings
void setup(){
  size(300, 300); // 開一個 300x300 的畫布
  rect(10, 10, 80, 80); // 畫一個方塊在左上角
  rect(110, 110, 80, 80); // 再畫一個方塊靠中間一點
  save("file.png"); 
  another = loadStrings("lines.txt"); // 嘗試去讀 lines.tet 這個文字檔,讀成功的話內容會變成陣列存在 another 裡
}

// 這邊是在定義一些變數
int x = 10, y = 10, ID = 0; // x 和 y 是畫方塊的位置,ID 是用來切換要畫哪一筆資料

// draw() 是畫面每一幀都會執行的東西
void draw(){
  background(204); // 每次重畫前,先清背景成灰色

  if(another != null){ // 如果有讀到檔案的話
    int [] now = int(split(another[ID], ' ')); // 把某一行(例如 "30 40")切開變成數字陣列
    rect(now[0], now[1], 80, 80); // 根據檔案的座標畫一個方塊
    ID = (ID+1)% another.length; // 下一幀就換下一筆資料,輪流播放
  }

  rect(x, y, 80, 80); // 畫出你目前可以拖曳的那個方塊
}

// 這邊是當你拖動滑鼠的時候會發生的事
void mouseDragged(){
  x += mouseX - pmouseX; // 算出滑鼠移動的距離,更新方塊的位置
  y += mouseY - pmouseY;

  String now = x + " " + y; // 把目前的位置變成一串字串
  lines.add(now); // 加進去 ArrayList 裡(就是記錄每次拖曳的位置)
}

// 一開始就先開好一個 ArrayList,用來記錄拖曳後的座標
ArrayList<String> lines = new ArrayList<String>(); 

// another 是用來存檔案讀進來的資料(還沒讀進來時是 null)
String [] another;

// 按鍵事件
void keyPressed(){
  String[] arr = new String[lines.size()]; // 建一個跟 lines 一樣長的陣列
  lines.toArray(arr); // 把 ArrayList 的資料轉換成陣列

  if(key=='s') saveStrings("lines.txt", arr); // 如果你按下 s,就把這些位置存成文字檔 lines.txt
}

一開始只有一個在記錄軌跡



下次讀取時用 loadStrings(),會重播剛剛走過的位置。





沒有留言:

張貼留言