- 最后登录
- 2013-6-5
- 注册时间
- 2011-12-5
- 阅读权限
- 90
- 积分
- 17782
- 纳金币
- 17782
- 精华
- 0
|
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 对象中。 |
|