李华明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