【J2ME3D系列学习文章之三】(立即模式)对立方体进行变换操作-旋转、缩放、平移

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/j2me-kjava/262.html

上一篇文章讲述了如何构造一个简单的立方体,以及对立方体设定颜色,那么这一章学习对立方体进行变换操作。

对上一篇文章的学习中也强调了两个 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 则标识缩小

            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;

        }

    }

}

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

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

时间: 2024-08-04 12:29:15

【J2ME3D系列学习文章之三】(立即模式)对立方体进行变换操作-旋转、缩放、平移的相关文章

【J2ME3D系列学习文章之二】(立即模式)构造我们3D世界中的第一个立方体!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-kjava/255.html 为什么要先构造一个立方体的例子,其实在论证概念时,立方体是一种极好的示例,当然它并不是复杂的 3D 设计的里程碑. 首先介绍构造一个3D立方体 需要的步骤: 第一:构造一个立方体的空间顶点 第二:构造一个立方体的各个面这里会用到三角形带 ,详细三角形带的解释看 @备注1 第三:构造一个摄像机 第四:绑定

【J2ME3D系列学习文章之一】J2ME3D开发技术和基础知识

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/j2me-kjava/249.html         由于J2me 3D(jsr184)的文章网上也有了不少,这里就不多说了,只是概括的说下针对于j2me 3D开发基本需要了解的知识以及简单阐述几个术语;  第一:开发模式  :         J2me 3D(jsr184)api 分为两种开发模式,一个是立即模式,另一个就是保留模式.这里简

设计模式的解析和实现(C++)之三-Builder模式

作用: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. UML结构图: 适用于以下情况: 1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 2)当构造过程必须允许被构造的对象有不同的表示时. 抽象基类: 1)Builder:这个基类是全部创建对象过程的抽象,提供构建不同组成部分的接口函数 接口: 1)Builder::BuildPartA,Builder::BuildPartB:是对一个对象不同部分的构建函数接口,Builder的派生类来具体实

Ext 3.0新增内容系列文章之三:DWR的替代品Ext.Direct

上一期的内容谈了DataWriter,实质是与DataReader相对应的产物.今期咱们讲Ext.Direct的内容,无论DataWriter还是Ext.Direct我们都可以先检查一下官方所提供的例子,结合本文,加深理解.   Ext.Direct的目的在于提供一个无缝的通讯流(streamline)介乎于客户端和服务端之间,形成一种单一的接口,从而使得我们减少一些乏味的编码,例如数据的验证和出来返回的数据包(读数据.错误条件等等).Ext.direct命名空间下有若干的类是为了与服务端更密切

MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据

下面我们将逐步讲解怎么在MVC模式下将MongoDB数据读取,并展示在前台Jqgrid表格上.这个"简易系 统"的基本设计思想是这样的:我们在视图层展示表格,Jqgrid相关Js逻辑全部放在一个Js文件中,控制层实现了"增删查改"四个业 务,MongoDB的基本数据访问放在了模型层实现   看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关 系型的数据库MongoDB.no

MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据_服务器其它

看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是MongoDB基本应用实现起来还是比较轻松的,甚至代码比基本的ADO.net访问关系数据源还要简洁.由于其本身的"非关系"的数据存储方式,使得对象关系映射这个环节对于MongoDB来讲显得毫无意义,因此我们也不会对MongoDB引入所谓的"ORM"框架. 下面我们将逐步

BAT机器学习面试1000题系列

几点声明: 1.本文的内容全部来源于七月在线发布的BAT机器学习面试1000题系列: 2.文章中带斜体的文字代表是本人自己增加的内容,如有错误还请批评指正: 3.原文中有部分链接已经失效,故而本人重新加上了新的链接,如有不当,还请指正.(也已用斜体标出) 4.部分答案由于完全是摘抄自其它的博客,所以本人就只贴出答案链接,这样既可以节省版面,也可以使排版更加美观.点击对应的问题即可跳转. 最后,此博文的排版已经经过本人整理,公式已用latex语法表示,方便读者阅读.同时链接形式也做了优化,可直接跳

Android中的Animation应用

最近在应用中用到了Animation.在网上浏览了下,感觉有些东西讲得很精辟.因此,我想总结下. Drawable最强大的功能是:显示Animation.AndroidSDK介绍了2种Animation: TweenAnimation(渐变动画):通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 FrameAnimation(帧动画)  :顺序播放事先做好的图像,类似放电影 在使用Animation前,我们先学习如何定义Animation,这对我们使用Animation会有很大的

Android单点触控实现图片平移、缩放、旋转功能_Android

相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对图片进行缩放,平移,旋转等操作可以使用Matrix来实现,Matrix就是一个3X3的矩阵,对图片的处理可分为四个基础变换操作,Translate(平移变换).Rotate(旋转变换).Scale (缩放变换).Skew(错切变换),如果大家对Matrix不太了解的话可以看看这篇文章(点击查看),作者对每一种Matrix的变换写