李華明Himi 原創,轉載務必在明顯處註明:
上一篇文章講述瞭如何構造一個簡單的立方體,以及對立方體設定顏色,那麼這一章學習對立方體進行變換操做。css
對上一篇文章的學習中也強調了兩個 Transform 對象的不一樣之處,這裏很少說了。操做立方體其實就是渲染的時候傳入Transform 對象參數對其改變狀態、位置、大小;那麼下面先貼出一段 在按鍵裏處理的代碼,而後註釋以及分析。那麼首先來介紹三個方法;html
全部操做名都是以 "post" 開頭的,表示當前 Transform 對象是從右邊與給定轉換矩陣相乘的 —— 矩陣操做的順序是很是重要的。若是您向右旋轉 90 度,而後走兩步,這時您所處的位置顯然與先走兩步再轉身不一樣。您能夠在各步行指令以後調用兩個 post 方法postRotate() 和 postTranslate(),從而得到上面的步行指令。調用順序決定了所得到的步行指令。因爲使用的是後乘,因此您最後使用的轉換會首先應用。java
M3G 有一個 Transform 類和一個 Transformable 接口。全部快速模式的 API 都可接受 Transform 對象做爲參數,用於修改其關聯的 3D 對象。另外,在保留模式下使用 Transformable 接口來轉換做爲 3D 世界一部分的節點,後續文章再進行詳細學習。web
private int XYZ;//標識當前操做的軸 private finale int STATE_ROATE=0,STATE_SCALE,STATE_TRANSLATE; private int state public void keyPressed(int key) { if (key == KEY_NUM7)//按鍵7表明改變當前操做的X?Y?Z?軸 XYZ++; if (XYZ > 2) XYZ = 0; else if (key == KEY_NUM9) XYZ--; if (XYZ < 0) XYZ = 2; if (key == KEY_NUM1) //按鍵1表示當前對其進行哪一種操做(旋轉、縮放仍是平移) state++; if (state > 2) state = 0; else if (key == KEY_NUM3) state--; if (state < 0) state = 2; float angle = 0;//角度; if (key == -1 || key == -2 || key == -3 || key == -4) { switch (state) { case STATE_ROATE://旋轉操做下,angle=負數則爲逆時針方向旋轉,正數反之 if (key == -1 || key == -3) angle = -10; else if (key == -2 || key == -4) angle = 10; if (XYZ == 0) tf_m.postRotate(angle, 1, 0, 0); else if (XYZ == 1) tf_m.postRotate(angle, 0, 1, 0); else if (XYZ == 2) tf_m.postRotate(angle, 0, 0, 1); break; case STATE_SCALE://縮放操做下,angle>1 標識方法 ,<1 則標識縮小 if (key == -1 || key == -3) angle = 0.8f; else if (key == -2 || key == -4) angle = 1.2f; if (XYZ == 0) tf_m.postScale(angle, 1, 1); else if (XYZ == 1) tf_m.postScale(1, angle, 1); else if (XYZ == 2) tf_m.postScale(1, 1, angle); break; case STATE_TRANSLATE://平移操做下,angle=負數則爲逆時針方向平移,正數反之 if (key == -1 || key == -3) angle = -1; else if (key == -2 || key == -4) angle = 1; if (XYZ == 0) tf_m.postTranslate(angle, 0, 0); else if (XYZ == 1) tf_m.postTranslate(0, angle, 0); else if (XYZ == 2) tf_m.postTranslate(0, 0, angle); break; } } }
代碼很簡單,也很容易理解。post
這裏爲了讓一些同窗更好的理解,那麼我來表明性的詳細說下 備註1 ;學習
咱們對立方體進行變化操做,那麼第一步:知道以哪一個軸來作操做,因此按鍵處理先對 定義的 XYZ 進行判斷,XYZ=1表明X軸 依次類推spa
;第二步:通過第一步肯定了以哪一個軸來作操做後,開始斷定咱們要對其進行什麼操做,備註1 在 STATE_ROATE狀態下,那確定是作旋轉的操做。接下來第三步:操做對應的值參數 angle 進行賦值;備註1這裏angle =10;意思是旋轉角度是10,你們看到賦值以前對按鍵也進行了斷定,當 -1 -3(對應模擬器的上方向與左方向),作逆時針旋轉;當 -2 -4(對應模擬器的下方向與右方向),作順時針旋轉;其實也就是旋轉角度10前面究竟是「+」號仍是「-」號!第四步:變化操做的方法postRotate()第一個參數爲角度,第二到四參數也表示的以哪一個軸來旋轉 ;這裏 傳入的是 1,0,0 ,也對應了XYZ =1 ,以X軸爲旋轉軸來操做!.net
固然可能我描述的也是以我理解的來說述的,若是仍是不理解,那麼把代碼放入項目中運行,本身手工修改angle,變化操做參數值等等來看運行效果就會很容易理解啦。code
(推薦你們訂閱本博客,由於咱的更新速度但是很快的~娃哈哈)orm
2010/12/9 0:23