【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. private int XYZ;//标识当前操作的轴  
  2. private finale int STATE_ROATE=0,STATE_SCALE,STATE_TRANSLATE;  
  3. private int state  
  4. public void keyPressed(int key) {  
  5.           if (key == KEY_NUM7)//按键7代表改变当前操作的X?Y?Z?轴  
  6.             XYZ++;  
  7.         if (XYZ > 2)  
  8.             XYZ = 0;  
  9.         else if (key == KEY_NUM9)  
  10.             XYZ--;  
  11.         if (XYZ < 0)  
  12.             XYZ = 2;  
  13.       if (key == KEY_NUM1) //按键1表示当前对其进行哪种操作(旋转、缩放还是平移)  
  14.         state++;  
  15.         if (state > 2)  
  16.             state = 0;  
  17.         else if (key == KEY_NUM3)  
  18.             state--;  
  19.         if (state < 0)  
  20.             state = 2;  
  21.         float angle = 0;//角度;   
  22.     if (key == -1 || key == -2 || key == -3 || key == -4) {  
  23.         switch (state) {  
  24.         case STATE_ROATE://旋转操作下,angle=负数则为逆时针方向旋转,正数反之  
  25.             if (key == -1 || key == -3)  
  26.                 angle = -10;  
  27.             else if (key == -2 || key == -4)  
  28.                 angle = 10;  
  29.             if (XYZ == 0)  
  30.                 tf_m.postRotate(angle, 1, 0, 0);  
  31.             else if (XYZ == 1)  
  32.                 tf_m.postRotate(angle, 0, 1, 0);  
  33.             else if (XYZ == 2)  
  34.                 tf_m.postRotate(angle, 0, 0, 1);  
  35.             break;  
  36.         case STATE_SCALE://缩放操作下,angle>1 标识方法 ,<1 则标识缩小  
  37.             if (key == -1 || key == -3)  
  38.                 angle = 0.8f;  
  39.             else if (key == -2 || key == -4)  
  40.                 angle = 1.2f;  
  41.             if (XYZ == 0)  
  42.                 tf_m.postScale(angle, 1, 1);  
  43.             else if (XYZ == 1)  
  44.                 tf_m.postScale(1, angle, 1);  
  45.             else if (XYZ == 2)  
  46.                 tf_m.postScale(1, 1, angle);  
  47.             break;  
  48.         case STATE_TRANSLATE://平移操作下,angle=负数则为逆时针方向平移,正数反之  
  49.             if (key == -1 || key == -3)  
  50.                 angle = -1;  
  51.             else if (key == -2 || key == -4)  
  52.                 angle = 1;  
  53.             if (XYZ == 0)  
  54.                 tf_m.postTranslate(angle, 0, 0);  
  55.             else if (XYZ == 1)  
  56.                 tf_m.postTranslate(0, angle, 0);  
  57.             else if (XYZ == 2)  
  58.                 tf_m.postTranslate(0, 0, angle);  
  59.             break;  
  60.         }  
  61.     }  
  62. }  

    代码很简单,也很容易理解。

    这里为了让一些同学更好的理解,那么我来代表性的详细说下 备注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,变化操作参数值等等来看运行效果就会很容易理解啦。





本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/605372,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值