【J2me3D系列學習文章之三】(當即模式)對立方體進行變換操做-旋轉、縮放、平移


 

 李華明Himi 原創,轉載務必在明顯處註明:
轉載自 【黑米GameDev街區】 原文連接:  http://www.himigame.com/j2me-kjava/262.html


 

  上一篇文章講述瞭如何構造一個簡單的立方體,以及對立方體設定顏色,那麼這一章學習對立方體進行變換操做。css

 

  對上一篇文章的學習中也強調了兩個 Transform 對象的不一樣之處,這裏很少說了。操做立方體其實就是渲染的時候傳入Transform 對象參數對其改變狀態、位置、大小;那麼下面先貼出一段 在按鍵裏處理的代碼,而後註釋以及分析。那麼首先來介紹三個方法;html

  • Transform.postScale(float sx, float sy, float sz):在 xyz 方向伸縮 3D 對象。大於 1 的值將按照給定因數擴大對象;0 1 之間的值將縮小對象。負值則同時執行伸縮和鏡像操做。
  • Transform.postTranslate(float tx, float ty, float tz):經過爲 xy z 座標增長指定值移動 3D 對象。負值則表示向負軸方向移動對象。
  • Transform.postRotate(float angle, float ax, float ay, float az):按給定角度繞穿過(0, 0, 0)和(ax, ay, az)的軸旋轉對象。角度爲正值,則表示若您順着正旋轉軸方向觀察,對象是按順時針旋轉的。例如,postRotate(30, 1, 0, 0) 將繞 x 軸將對象旋轉 30 度。

       全部操做名都是以 "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 


原文連接: http://blog.csdn.net/xiaominghimi/article/details/6064367
相關文章
相關標籤/搜索