查看: 4541|回复: 9
打印 上一主题 下一主题

[Java3D] 快来看啊!!Java3D实现三维显示(2)

[复制链接]

1026

主题

1

听众

6011

积分

高级设计师

Rank: 6Rank: 6

纳金币
5996
精华
1

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

跳转到指定楼层
楼主
发表于 2011-8-2 20:27:26 |只看该作者 |倒序浏览
3.3 Java3D中用来定义观察的对象
Java3D通过几个对象来发布它的观察模式。特别是View对象和与它相关的组件对象:PhysicalBody对象、PhysicalEnvironment对象、Canvas3D对象、Screen3D对象。图3描述了View对象的中心角色和组件对象的辅助角色。
观察有关的对象都在图3中,它们起的作用如下:
ViewPlatform(观察平台):一个view用一个叶子结点来在场景图为自己定位。观察平台的起始结点指定了它的位置、方向和在虚拟世界中的比例尺。
View(观察):主要的观察对象包含了很多观察的状态。
Canvas3D:抽象窗口工具箱中画布对象的3D版本。它描绘了一个可以让Java3D在上面画图像的窗口。它包括了一个对Screen3D对象的引用和描述一个Canvas3D要用到的尺寸、形状和位置信息。
Screen3D:一个包含描述显示荧屏物理属性信息的对象。Java3D把显示荧屏信息分别放在单独的对象中,这样做可以防止在每一个Canvas3D对象中不同的显示屏幕信息共享一个屏幕。
PhysicalBody:一个包含刻度信息的对象,它描述了用户的物理身体。
PhysicalEnvironment:一个包含刻度信息的对象,它描述了物理世界。主要的信息描述了环境的六自由度硬件。


图3:View和它的组件对象以及它们的相互联系

                                                         

这些对象一起描述观察的几何体胜于明白的提供观察或投影基体。Java3D的表现工具用这个信息来构造适合的观察和投影基体。这些观察对象的几何中心为产生一个观察提供了更大的弹性,这种弹性需要支持可以选择的显示配置。
3.4 ViewPlatform: 在虚拟世界中的位置
一个Viewplatform结点定义了一个坐标系统。这样,在虚拟世界中就有了一个有原点或参考点的参考系。观察平台是一个附加在观察对象的点并且作为决定描绘工具观察的基础。
图4表示了一个场景图的一部分,它包括一个观察平台结点。直接在观察平台之上的结点决定了它在虚拟世界中的位置和方向。应用程序和或行为通过修改直接在观察平台之上任何与TransformGroup结点结合的Tramsform3D对象可以在虚拟世界中任意移动VierPlatform。一个简单的应用程序可能直接在一个观察平台上定义一个TransformGroup结点。
一个虚拟宇宙可能有很多不同的观察平台,但是一个特定的View对象只能附加于一个单一的观察平台之上。这样,每个画在Canvas3D上的图画都是从一个单一的观察平台开始。


图4:包含观察平台的一部分场景图



3.5 如何在虚拟世界中移动
应用程序通过修改观察平台的上级TransformGroup在虚拟世界中航行。修改一个观察平台的位置和方向的应用程序的例子包括:浏览器、提供航行控制的阅读器、做建筑预设计的程序、甚至是搜寻和毁坏游戏。
控制观察平台对象能产生很有趣和有用的结果。我们可以定义一个简单的场景图,这个程序的目的是在窗口的正中画了一个对象并且绕自己的中心转动。
我们不管在中心的对象,而让ViewPlatform在虚拟世界中绕圈。如果形体结点包括一个地球模型,这个程序可能产生一个类似于绕地球的远航员观察对象。
如果在这个世界中加入更多的对象,这个场景图允许经由行为结点来浏览整个虚拟世界。


图5:一个由观察控制的简单场景图



应用程序和动作通过TransformGroup的可访问方法操纵它。这些方法允许应用程序得到和设置组结点的Transform3D对象。Transform3D结点有setTransform和getTransform两个方法。
3.6 加载于喜欢的地方
一个场景图可能包括多个观察平台对象。如果用户把一个观察对象从一个观察平台分离,然后把这个观察对象附加到另外一个不同的观察平台上。显示屏上的图像现在就要从新的观察平台上的观察点画图了。
在Java3D的绘图机制中,真实的观察由当前附加观察平台的观察附加策略决定。观察平台定义了设置和得到观察附加策略的方法:

   
        
            
            
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 建立、移动观察点代码


   
        
            
            
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);      
….

            
        
   





回页首
将Java3D与Java平台技术的结合
Java3D可以很容易的与Java平台的其他技术相结合,如Applet、JSP、Serverlet、JDBC、EJB等。100%的纯Java实现是Java3D可以与如此多的Java平台技术结合的根本原因:

    同是Java平台保证Java3D可以在Applet中实现;
    Applet使Java3D可以轻易的在网页中显示;
    JSP、Serverlet技术保证将动态网页技术用于Java3D显示;
    Serverlet本身就是J2EE平台的核心技术,这使得Java3D可以搭建于J2EE平台。更可以使用所有J2EE的其他技术:JDBC、EJB、JMS…

4.1 在网页上显示3D图形
Java3D一个最大的特性是可以使用Applet作为显示容器,例3和例4的代码分别显示了如何在Applet中显示3D图形和在网页文件中(HTML)嵌入该Applet。


例3 Applet实现Java3D


   
        
            
            
Public class HelloUniverse extends Applet {
private SimpleUniverse u = null;   
public BranchGroup createSceneGraph() {       
BranchGroup objRoot = new BranchGroup();   
….       
return objRoot;  
}   
public void init() {
Canvas3D c = new Canvas3D(config);       
add("Center", c);   
….
u.addBranchGraph(scene);   
}  
….
}

            
        
   





例4 在网页嵌入显示3D Applet


   
        
            
            
<HTML>
<HEAD>
<TITLE>Hello, Universe!</TITLE>
</HEAD>
<BODY BGCOLOR="#000000">
<applet align=middle code="HelloUniverse.class" width=256 height=256>
</applet>
</BODY>
</HTML>

            
        
   



4.2 动态网页技术与Java3D
通过Jsp和Serverlet,可以使Java3D在网页中"动"起来。虽然Java3D本身就有三维动画的功能,但是这里的"动"指得是赋予了程序编写人员对Java3D动态的控制能力。改造上面的HelloUniverse,例5 的jsp代码可以实现控制旋转的正方体大小的功能。通过每次Random对象生成的随机数,立方体的大小也是随即改变,这段程执行的效果,如图6、7所示。


例5实现可以动态调整三位物体大小的jsp代码


   
        
            
            
<%@ page contentType="text/html; charset=GBK" %>
<HTML>
<HEAD>
<TITLE>Hello, Universe!</TITLE>
</HEAD>
<BODY BGCOLOR="#000000">
<%int i=300;%>
<%float j=i*(new java.util.Random()).nextFloat();%>
<applet align=middle code="HelloUniverse.class" width=<%=j%> height=<%=j%>>
</applet>
</BODY>
</HTML>

            
        
   


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

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

沙发
发表于 2012-2-2 23:22:59 |只看该作者
凡系斑竹滴话要听;凡系朋友滴帖要顶!
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

板凳
发表于 2012-5-17 23:21:28 |只看该作者
水……生命之源……灌……
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

地板
发表于 2012-8-10 00:02:31 |只看该作者
顶!学习了!阅!
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

5#
发表于 2012-8-20 23:30:28 |只看该作者
心中有爱,爱咋咋地
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

6#
发表于 2012-9-30 23:24:07 |只看该作者
呵呵,真得不错哦!!
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

7#
发表于 2012-10-14 23:20:40 |只看该作者
不会吧,太恐怖了
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

8#
发表于 2013-1-30 23:33:10 |只看该作者
谢谢楼主,真是太实用了
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

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

9#
发表于 2013-2-18 23:18:22 |只看该作者
百度的叫度娘,网易的叫易娘,新浪内部还在为是叫新娘还是浪娘而争论不休!……不管你们是企鹅的额娘,豆瓣的伴娘,还是华为的伪娘,都要记得,淘宝才是你们的亲娘啊!亲!!
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

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

10#
发表于 2013-3-20 23:20:42 |只看该作者
呵呵,真得不错哦!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

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

GMT+8, 2024-11-14 13:38 , Processed in 0.481401 second(s), 29 queries .

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

© 2008-2019 Narkii Inc.

回顶部