chinavideoonline.com
中国视频在线(www.chinavideoonline.com)致力于收集各种流媒体相关的技术资料,以及流媒体常识和应用方案,力求为广大朋友了解学习和使用流媒体技术提供帮助

用JSP技术创造自己的VRML世界

作者/来源:BUILDER.COM
VRML(虚拟现实模型语言)是一种简单的描述三维外形的文本语言。使用者与三维外形、质地、声音和动画交互。JSP(Java Server Pages)是一种用来使任何浏览器看到动态效果的工具。用户通常只与数据库、企业系统和网页服务器打交道。
 

在本教程中,你将学会如何使VRML和JSP互动,以及如何将网络或基于网络的应用程序与丰富的动画和三维动画结合起来。

流程
图A展示了浏览网页的一般流程——浏览器发出访问某个网页的请求,该请求被指定的JSP收到,JSP再访问数据库。我们这个例子遵循这个模型。

请求过程

收到请求后,系统将按图B所示的流程工作。数据库将被请求的数据发给JSP,JSP将数据组成一定格式后发给请求的浏览器。在我们的例子中,数据库发出的数据返回到JSP并产生了VRML场景。

图B

回应过程

环境
 

我们的例子曾在配有Java开发工具包(JDK)1.31版的Tomcat服务器上进行了测试,但是这些测试结果是标准的,它们没有像在Java网络服务器或其它JSP网络服务器(装有JDK 1.2版或更高版本)上那样显示VRML效果。数据库的功能在微软SQL Server 2000和Oracle8i数据库服务器上进行了测试。我用的是Cortona VRML浏览器。

建立服务器
为了使JSP应用程序用一种浏览器可以正确理解的方式返回VRML,网络服务器需要正确设置扩展MIME(多用途网际邮件扩展协议)。VRML文件以“.wrl”为后缀。以下是Tomcat网页中xml文件的一段节选:

<mime-mapping>
<extension>wrl</extension>
<mime-type>x-world/x-vrml</mime-type>
</mime-mapping>

如测试例子用到Tomcat服务器一样,该网络服务器应该已经正确设置了扩展MIME。

调试
如果浏览器不在JSP的输出端口上,我推荐你使用两个浏览器:一个已经安装了VRML客户程序,另一个没有。我在Internet Explorer的基础上安装了一个VRML浏览器并在Netscape的基础上调试JSP。

源文件
为了看到使用VRML和JSP可以达到的效果,我们建立了一个演示例子。该例子的源文件如下:

Sphere.wrl 包含了一个虚拟球体的例子。
Create.wrl 展示了VRML与JSP对话的另一种方式。
Db.jsp 从数据库获得用于动态创建虚拟球的数据。
Create2.wrl和db2.jsp 是关于在create.wrl所展示技术的进一步演示。
联接JSP和VRML头
对大多数服务器来说,JSP对头有相当的容错性。然而,当头的第一行出现语法错误时,VRML浏览器就会出现很大的麻烦。

当服务器发出回应时,它将削去所有的JSP代码。这样,在仅有JSP代码的行上,服务器将向浏览器发送一个空行。这就是说,如果一个JSP文件的第一行是<%@ page language="java" %>(这一行仅有JSP代码),VRML浏览器就会报错而不是正确地显示页面。

如果必须包含同时包含JSP头和VRML头,那就把它们放在一行,如下所示:
<%@ page language="java" %> #VRML V2.0 utf8

现在在设置VRML头之前,必须改变内容类型,那么最终结果如下所示:
<%@ page language="java" %><%response.setContentType("x-world/x-vrml");%>#VRML V2.0 utf8

 
VRML球
 

我们例子地目标是显示一个虚拟现实外形:一个球体。其VRML代码如下所示:
DEF sphere Transform {
translation 0 0 0
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 1 1 1
} }
geometry Sphere {
radius 1
} } ] }

JSP脚本将加入其中,它可以用动态数据来改变虚拟球在空间地位置(用X、Y、Z三轴坐标)、球的颜色(利用红色、绿色、蓝色这三种颜色的色差)、球的半径。清单A包含了文件sphere.wrl中的所有代码。清单B为文件create.wrl的内容,它联接JSP与数据库用以建立VRML。

数据表
 
我建立了一个名为spheres的表格,数据如表A所示。
表A

序号 颜色 半径
1 0.1.0.1.0.2 1
2 0.2.0.2.0.4 2
3 0.3.0.3.0.6 3
4 0.4.0.4.0.8 4

正如你所见,第一个球是完全黑的(0.1 0.1 0.2),第二个球稍微亮些,第四个最亮(0.4 0.4 0.8)。

摄像机视角
 
我给虚拟世界一个默认的视点——面对摄像机距虚拟球一个合适的距离。

Viewpoint
{
position 20 0 50
orientation 1 0 0 -0.1
description "Entry"
}

视点距虚拟球50单位距离远(即沿x轴正方向20),这样,球完整地在页面上显示出来。

JSP
 
 

为了正确导入程序包(Java.sql*),需要建立数据库联接。
<%@ page import="java.sql.*" %>

下面是用来联接Oracle数据库的字符串。
<%
String driver = "oracle.jdbc.driver.OracleDriver";
String dburl = "jdbc:oracle:thin:@faustus:1521:intra";
String dbuid = "spheres";
String dbpwd = "spheres";
%>

在这个例子中SQL(结构化查询语言)代码非常简单——返回表中数据:
String sql = "SELECT * FROM spheres";

一旦建立联接,下面的代码就会把数据库中所有的记录循环访问一遍并显示虚拟球。代码如下:
int count = 0;
while(rs.next()) {
color = rs.getString("color");
radius = rs.getString("radius");
%>
DEF sphere<%=count%> Transform {
translation <%=count*15%> 0 0
children [
Shape {
appearance Appearance {
material Material {
diffuseColor <%=color%> }
}
geometry Sphere {
radius <%=radius%>
} } ] }
<%
count++;
}

注意从数据库获得的数据是如何插入VRML中的。<%=color%>和<%=radius%>这两行VRML代码从数据库获得设定的颜色和半径值并将其显示出来。

转换过程用一个整数(count)来控制,它在循环中跟踪被访问的记录数,并控制在x轴方向每隔15单位显示一个虚拟球。

变量count还有另外一个用处。当产生虚拟球对象时,我们给它们命名为sphere1、sphere2……以此类推。这样,我们就可以用count在VRML中这样命名对象:
DEF sphere<%=count%>
整合JSP和VRML的另一种途径
 
 

当你已经用VRML(.wrl)文件建立了一个虚拟世界,也许你会希望添加一些动态功能但又不想把VRML文件转化为JSP,解决方法就是使用VRML脚本:
DEF grp Group{}
Script {
field SFNode group USE grp
url "javascript:
function initialize() {
urlString = new MFString('db.jsp');
Browser.createVrmlFromURL(urlString, group, 'addChildren');
} " }

VRML脚本包含了JSP的响应并将它存在一个字符串中。然后,VRML脚本以该字符串为参数,调用一个名为Browser.createVrmlFromURL的函数。用该函数来实现JSP返回到群结点的内容。群结点(group node,简写为grp)是VRML中的概念,本文不予讨论。

现在用于创建真实动态显示的VRML脚本与JSP的联接已经建立了。传递参数给JSP的最简单的方法是使用GET。注意parmString是如何建立起来的。它可以包含需要传给JSP的任何信息。

JSP接受参数的过程如下(完整代码在清单E中):
int sp = 4;
if (request.getParameter("sp") != null)
{
sp = Integer.parseInt(request.getParameter ("sp"));
}

循环条件语句改为while(rs.next() && count < sp),这样可以根据我们通过VRML脚本送出的参数来限制虚拟球显示的数目。

建立你自己的VRML世界
 
我们已经考察了两种整合JSP和VRML的途径。一种是用JSP动态创建VRML,另一种是用VRML脚本调用JSP,后者返回的数据创建VRML。这些帮助我们建立自定义的三维世界的技术给使用者带来了深刻的体验。


发表评论:
昵称 *

邮箱 *

评论* (最长不超过500汉字)