12 第1页 | 共2 页下一页
返回列表 发新帖
查看: 3631|回复: 13
打印 上一主题 下一主题

[电商] Java3D探奇-变换你的世界

[复制链接]

1096

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
17782
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2011-12-26 14:38:35 |只看该作者 |倒序浏览
Transform3D 类


变换允许您在场景中移动、旋转或调整几何对象的大小,也可以用来影响查看场景的方式。当进行 Java 3D 编程时,将经常使用 Transform3D 对象。Transform3D 对象代表一个变换矩阵。Transform3D 对象通常由 TransformGroup 类使用。我们将不会讨论 Transform3D 中的许多方法 ― 而仅仅是一些助手函数 ― 而且令人感到欣慰的是,我们也不用讨论线性代数。



移动、缩放以及旋转对象



让我们从 Transform3D 类中的一些助手函数着手:

setTranslation(Vector3f trans):平移(移动)对象。用 trans 参数中的 x、y 和 z 值来替换本次变换的平移值。



setScale(double scale):设置该变换的比例。使用该函数来调整对象的大小。



rotX(double angle):将旋转组件设置成绕 X 轴逆时针旋转。请注意调用 rotX() 会删除矩阵中的非旋转组件。方法 rotY() 和 rotZ() 也是非常有用的。角度以弧度指定,因此如果有必要,请使用 Math.toRadians(degrees) 将角度从度转换成弧度。


OrbitBehavior 类


OrbitBehavior 类允许您使用鼠标方便地移动视图。当用户移动鼠标时,它会平移、旋转以及缩放场景。下面的代码片段将 OrbitBehavior 添加到 ViewingPlatform 中。无需其它代码。(我们稍后将讨论界限球和行为。)



ViewingPlatform viewingPlatform = universe.getViewingPlatform();

orbit = new OrbitBehavior(canvas);

BoundingSphere bounds =

new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);

orbit.setSchedulingBounds(bounds);

viewingPlatform.setViewPlatformBehavior(orbit);



请注意 OrbitBehavior 使用 SimpleUniverse 对象来操纵场景图的视图部分。还要注意的是,大多数 Java 3D SDK 样本都外加了 OrbitBehavior,您也应该在您的程序中这么做 ― 这将有助于移动对象并查看它们。我们将在本教程的余下部分回过头来讨论场景图的内容部分。

在 3D 空间中迷失


当您构建起场景图层次结构时,您会使用许多 TransformGroup 节点。您想绘制的几何对象将定位于图中的叶子上。将场景图的根与该几何叶子连接的节点路径上通常将有几个 TransformGroup 节点在其中。根和几何对象之间的所有变换都按顺序应用到那个形状,并且变换的顺序将会影响到几何对象的最终位置。

将您想做的每一项逻辑操作放在一个单独的 Transform3D 对象中(例如,将旋转操作放在一个对象中而将平移操作放在另一个对象中)。在渲染遍历期间当 Java 3D 遍历场景图时,会将这些变换组合在一起。

变换之间不是可互换的 ― 先旋转再平移同先平移再旋转的结果不同。下图演示了从两个不同的视点对观察到的几个 Cone 图元进行变换(圆柱代表轴)。我们将在下一页回顾生成该图的代码和这些圆锥各自的场景图构造。



TransformOrder 代码



以下是 TransformOrder.java 示例的简化程序块。其中有两个 TransformGroup 节点和一个 Cone,一个连接在另外一个下面。唯一的区别只是连接它们的次序和 Cone 的颜色。在红色圆锥中,objRotate TransformGroup 位于 objTranslate 之上,而对于黄色圆锥,平移在顶部,而旋转在下面。这意味着根节点到圆锥之间的路径上有不同的次序。以下是创建圆锥体及其变换的代码。



void rotateOnTop(){

topNode.addChild(objRotate);

objRotate.addChild(objTranslate);

objTranslate.addChild(redCone);

}

void translateOnTop(){

topNode.addChild(objTranslate);

objTranslate.addChild(objRotate);

objRotate.addChild(yellowCone);

}

void noTransform(){

topNode.addChild(purpleCone);

}

变换要点


变换可用于指定场景中几何对象的位置。

将 OrbitBehavior 与 SimpleUniverse 一起使用。

使用 Transform3D 助手函数。

为简单起见,将想做的每个逻辑操作放在一个不同的 Transform3D 对象中。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2012-1-24 23:23:50 |只看该作者
祝你新年很灿烂,牛气哄哄冲霄汉,祝你明年业务多,好运连连一火车,祝你工作小轻松,玩玩闹闹很成功,祝你身体特别好,吃嘛嘛香没烦恼。
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

板凳
发表于 2012-2-4 23:30:41 |只看该作者
凡系斑竹滴话要听;凡系朋友滴帖要顶
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

地板
发表于 2012-2-8 23:29:07 |只看该作者
发了那么多,我都不知道该用哪个给你回帖了,呵呵
回复

使用道具 举报

1096

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
17782
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2012-2-9 10:52:51 |只看该作者
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2012-3-24 23:26:17 |只看该作者
无聊时可以刷屏幕 灌水 也可以试试 帖子的标题究竟可以写多长
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2012-4-27 23:18:39 |只看该作者
凡系斑竹滴话要听;凡系朋友滴帖要顶
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2012-5-2 23:22:08 |只看该作者
爱咋咋地!
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

9#
发表于 2012-7-21 23:28:25 |只看该作者
其实楼主所说的这些,俺支很少用!
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

10#
发表于 2012-8-18 00:10:13 |只看该作者
俺是新人,这厢有礼了!
回复

使用道具 举报

12 第1页 | 共2 页下一页
返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-2-6 19:43 , Processed in 0.067457 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部