Java3D 实现三维显示(5)Java3D 的观察模式
- UID
- 1066743
|
Java3D 实现三维显示(5)Java3D 的观察模式
3.5 如何在虚拟世界中移动应用程序通过修改观察平台的上级 TransformGroup 在虚拟世界中航行。修改一个观察平台的位置和方向的应用程序的例子包括:浏览器、提供航行控制的阅读器、做建筑预设计的程序、甚至是搜寻和毁坏游戏。
控制观察平台对象能产生很有趣和有用的结果。我们可以定义一个简单的场景图,这个程序的目的是在窗口的正中画了一个对象并且绕自己的中心转动。
我们不管在中心的对象,而让 ViewPlatform 在虚拟世界中绕圈。如果形体结点包括一个地球模型,这个程序可能产生一个类似于绕地球的远航员观察对象。
如果在这个世界中加入更多的对象,这个场景图允许经由行为结点来浏览整个虚拟世界。
图 5. 一个由观察控制的简单场景图应用程序和动作通过 TransformGroup 的可访问方法操纵它。这些方法允许应用程序得到和设置组结点的 Transform3D 对象。Transform3D 结点有 setTransform 和 getTransform 两个方法。
3.6 加载于喜欢的地方一个场景图可能包括多个观察平台对象。如果用户把一个观察对象从一个观察平台分离,然后把这个观察对象附加到另外一个不同的观察平台上。显示屏上的图像现在就要从新的观察平台上的观察点画图了。
在 Java3D 的绘图机制中,真实的观察由当前附加观察平台的观察附加策略决定。观察平台定义了设置和得到观察附加策略的方法:
1
2
| public void setViewAttachPolicy(int policy)
public int getViewAttachPolicy()
|
这些方法设置和得到在虚拟世界策略中的共存中心。默认的附加策略是 View.NOMINAL_HEAD。观察平台的附加观察策略决定了 Java3D 怎样在观察平台中放置出射点。这个策略可以是以下的几个值之一:
View.NOMINAL_HEAD:保证终端用户在物理世界名义上的眼睛位置对应于在虚拟世界中虚拟眼睛的位置。本质上,这个策略告诉 Java3D 要用同一种方法把虚拟出射点和观察平台原点及物理出射点和物理世界的原点相对放置。物理世界中出射点的方向和位置与原点的背离会产生相应的虚拟出射点的方向和位置在虚拟世界中的背离。
View.NOMINAL_FEET:保证终端用户的虚拟世界中的脚一直接触虚拟地面,这个策略告诉 Java3D 要以这种约束计算物理-虚拟世界的通信。为达到之一目的,Java3D 通过移动终端用户的眼睛位置和物理高度。Java3D 用在 PhysicalBody 对象中的 nominalEyeHeightFromGround 参数来执行这个计算。
View.NOMINAL_SCREEN:允许应用程序总是拥有一个和"感兴趣的点"保持"可观察"距离的出射点。这个策略也决定了 Java3D 计算"物理到虚拟世界"通信的方法。这个方法保证程序根据 PhysicalBody 对象定义 nominalEyeOffsetFromNominalScreen 参数来设置虚拟出射点与要表现的点之间的距离。
3.7 在三维世界中建立、移动观察点 形体移动的实现向来都是三维实现的难点和复杂之处,传统三维技术的实现多是注重模拟三维物体的真实移动。而 Java3D 除了提供传统的方案,还可以在一个存在的三维世界中移动一个观察点,借助观察点的移动模拟物体的移动。如同物理所学的切割磁力线发电,转子和静子本来就是一对可以互逆的对象,结果都是把动能转化为电能。例 2 的代码显示了在 Virtual Universe 中建立 Viewer、ViewPlatForm、和如何通过绑定 OrbitBehavior 实现移动 ViewPlatform。
例 2. 建立、移动观察点代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| setLayout(new BorderLayout());
Canvas3D c = new Canvas3D(null);
add("Center", c);
Viewer viewer = new Viewer(c);
Vector3d viewpoint = new Vector3d(0.0,0.0,2.41);
//初始观察点位置
Transform3D t = new Transform3D();
t.set(viewpoint);
ViewingPlatform v = new ViewingPlatform( );
v.getViewPlatformTransform().setTransform(t);
u = new SimpleUniverse(v,viewer);
u.getViewingPlatform();
ViewingPlatform viewingPlatform = u.getViewingPlatform();
OrbitBehavior orbit = new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
BoundingSphere bounds =
new BoundiBoundingSpherengSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
orbit.setSchedulingBounds(bounds);
viewingPlatform.setViewPlatformBehavior(orbit);
….
|
|
|
|
|
|
|