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);3.上臂可以隨滑鼠 Y 旋轉}// 多了 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(); // 還原狀態
//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_anglePShape 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_loadStringsvoid 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(),會重播剛剛走過的位置。
沒有留言:
張貼留言