上一篇文章講述了如何構造一個簡單的立方體,以及對立方體設定顔色,那麼這一章學習對立方體進行變換操作。
對上一篇文章的學習中也強調了兩個 transform 對象的不同之處,這裡不多說了。操作立方體其實就是渲染的時候傳入transform 對象參數對其改變狀态、位置、大小;那麼下面先貼出一段 在按鍵裡處理的代碼,然後注釋以及分析。那麼首先來介紹三個方法;
transform.postscale(float sx, float sy, float sz):在 x、y、z 方向伸縮 3d 對象。大于 1 的值将按照給定因數擴大對象;0 和 1 之間的值将縮小對象。負值則同時執行伸縮和鏡像操作。
transform.posttranslate(float tx, float ty, float tz):通過為 x、y 和 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(),進而獲得上面的步行指令。調用順序決定了所獲得的步行指令。由于使用的是後乘,是以您最後使用的轉換會首先應用。
m3g 有一個 transform 類和一個 transformable 接口。所有快速模式的 api 均可接受 transform 對象作為參數,用于修改其關聯的 3d 對象。另外,在保留模式下使用 transformable 接口來轉換作為 3d 世界一部分的節點,後續文章再進行詳細學習。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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 則辨別縮小
angle = 0.8f;
angle = 1.2f;
tf_m.postscale(angle, 1, 1);
tf_m.postscale(1, angle, 1);
tf_m.postscale(1, 1, angle);
case state_translate://平移操作下,angle=負數則為逆時針方向平移,正數反之
angle = -1;
angle = 1;
tf_m.posttranslate(angle, 0, 0);
tf_m.posttranslate(0, angle, 0);
tf_m.posttranslate(0, 0, angle);
}
}
}
代碼很簡單,也很容易了解。
這裡為了讓一些同學更好的了解,那麼我來代表性的詳細說下 備注1 ;
我們對立方體進行變化操作,那麼第一步:知道以哪個軸來做操作,是以按鍵處理先對 定義的 xyz 進行判斷,xyz=1代表x軸 依次類推
;第二步:經過第一步确定了以哪個軸來做操作後,開始判定我們要對其進行什麼操作,備注1 在 state_roate狀态下,那肯定是做旋轉的操作。接下來第三步:操作對應的值參數 angle 進行指派;備注1這裡angle =10;意思是旋轉角度是10,大家看到指派之前對按鍵也進行了判定,當 -1 -3(對應模拟器的上方向與左方向),做逆時針旋轉;當 -2 -4(對應模拟器的下方向與右方向),做順時針旋轉;其實也就是旋轉角度10前面到底是“+”号還是“-”号!第四步:變化操作的方法postrotate()第一個參數為角度,第二到四參數也表示的以哪個軸來旋轉 ;這裡 傳入的是 1,0,0 ,也對應了xyz =1 ,以x軸為旋轉軸來操作!
當然可能我描述的也是以我了解的來講述的,如果還是不了解,那麼把代碼放入項目中運作,自己手工修改angle,變化操作參數值等等來看運作效果就會很容易了解啦。