天天看點

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

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

對上一篇文章的學習中也強調了兩個 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,變化操作參數值等等來看運作效果就會很容易了解啦。