2008年5月7日星期三

[转]使用Java3D实现三维图像-6

4 将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。

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);
}
….
}
例3 Applet实现Java3D

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

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

  4.2 动态网页技术与Java3D

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

<%@ 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>
例5实现可以动态调整三位物体大小的jsp代码


图6 Jsp显示效果1


图6 Jsp显示效果2

  4.3 J2EE平台对Java3D的支持

  上面的例子只是通过动态设定Applet大小来控制Java3D的显示,实际上可应通过更多的方法实现Jsp、Serverlet对Java3D显示效果的控制,甚至可以将Java3D置于J2EE平台的显示层,实现对EJB、JDBC的调用。

   实现Java3D利用J2EE平台资源的方法很多,甚至可以直接在Java3D的实现类中直接调用EJB。但是从J2EE平台的设计模式出发,把对 EJB调用放到Jsp中,而将返回的结果作为参数传入实现Java3D的Applet类中是一个更好的模式。具体代码见例6。

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="javax.ejb.*" %>
<%@ page import="java.rmi.*"%>
<%@ page import="javax.rmi.PortableRemoteObject"%>
<%@ page import="javax.naming.*"%>
<%@ page import="java.util.Properties"%>
<HTML>
<HEAD>
<TITLE>Hello, Universe!</TITLE>
</HEAD>
<BODY BGCOLOR="#000000">
<% try{
Properties properties = null;
Context context = new InitialContext(properties);
Object ref = context.lookup("Customer");
EJBHome home= (EJBHome)PortableRemoteObject.narrow(ref,CustomerHome.class);
CustomerHome home=(CustomerHome)home;
Customer customer= home.findByPrimaryKey("1000000");
String data = customer.getData();
}
catch(Exception e){e.printStackTrace();}
%>
<applet align=middle code="HelloUniverse.class" width=200 height=200>
<param name="Data" value=<%=data%>>
</applet>
</BODY>
</HTML>
例6调用EJB作为Java3D参数代码

  上面的代码首先访问JNDI名为"Customer"的EJB,然后将返回值作为参数传入实现Java3D的Applet。

  Java3D与J2EE是相互支持的关系:Java3D丰富、强化了J2EE的显示模式,使略显枯燥的J2EE客户端光鲜多彩;J2EE平台为Java3D提供了支持,功能强大的Server端处理能力为三维显示所需的复杂计算和大数据量提供了有力的支持。

  我们可以想象下面的两幅场景:

  通讯卫星将全国所有道路、建筑信息录入大型数据库;EJB实现应用逻辑并将之部署到AppServer上;所有支持JVM的手机、PDA、车载GPS可以通过调用EJB显示与真实世界一模一样的周围环境。

  地震局根据实际勘测到的地表等高线信息绘制二维矢量图,存为FDX文件;将二维图像转为三维实现的复杂算法放到EJB中实现;Jsp页面调用EJB后可以在Appet上实现三维GIS的显示。

  有了Java3D和Java,这一切都不只是梦想。

没有评论: