纳金网
标题:
Java3D探奇-变换你的世界
[打印本页]
作者:
愤怒的小猪
时间:
2011-12-26 14:38
标题:
Java3D探奇-变换你的世界
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 对象中。
作者:
奇
时间:
2012-1-24 23:23
祝你新年很灿烂,牛气哄哄冲霄汉,祝你明年业务多,好运连连一火车,祝你工作小轻松,玩玩闹闹很成功,祝你身体特别好,吃嘛嘛香没烦恼。
作者:
晃晃
时间:
2012-2-4 23:30
凡系斑竹滴话要听;凡系朋友滴帖要顶
作者:
晃晃
时间:
2012-2-8 23:29
发了那么多,我都不知道该用哪个给你回帖了,呵呵
作者:
愤怒的小猪
时间:
2012-2-9 10:52
作者:
奇
时间:
2012-3-24 23:26
无聊时可以刷屏幕 灌水 也可以试试 帖子的标题究竟可以写多长
作者:
奇
时间:
2012-4-27 23:18
凡系斑竹滴话要听;凡系朋友滴帖要顶
作者:
C.R.CAN
时间:
2012-5-2 23:22
爱咋咋地!
作者:
晃晃
时间:
2012-7-21 23:28
其实楼主所说的这些,俺支很少用!
作者:
晃晃
时间:
2012-8-18 00:10
俺是新人,这厢有礼了!
作者:
晃晃
时间:
2012-10-16 23:21
凡系斑竹滴话要听;凡系朋友滴帖要顶!
作者:
tc
时间:
2012-10-20 23:25
你们都躲开,我来顶
作者:
晃晃
时间:
2012-10-26 23:27
凡系斑竹滴话要听;凡系朋友滴帖要顶
作者:
.
时间:
2012-11-1 22:04
好棒哦!哈哈~期待楼主有更多的作品分享给我们!
欢迎光临 纳金网 (http://go.narkii.com/club/)
Powered by Discuz! X2.5