十三、X3D的嵌入脚本Java编程技术
由于Java语言功能强大,且字节流运行速度比JavaScript、VrmlScript要快,不仅是复杂编程,一般简单编程也可以用Java,以实现动态、交互、三维的WWW虚拟场景。但在具体应用时,存在着各VRML浏览器的兼容性问题,VRML场景中的Java编程功能有可能在一种浏览器上运行正常,而在另一种浏览器上根本就不能工作;发布在网络上可以正常工作,而在本地就不能正常工作;不同的VRML浏览器的稳定性和一致性不能满足用户要求,还需要进行兼容设计。
在本节中,我们先来看一个实例过程,然后说明其简单编程与调试方法。
一、 安装配置JDK
使用JDK1的兼容性要好些,安装也简单,我们可使用jdk-1_0_2。
首先将jdk-1_0_2-win32-x86.exe解压至C:\java。
JAVA3D调用VRML图形所用的0.3M的vrml97.jar一般放置在 C:\jdk1.3\jre\lib\ext 或用classpath指定其位置。在本例中放在C:\jdk\中。后面通过批处理命令文件来设置与执行。
二、 X3d-Edit编程
在上面的例子48中,我们用Java来实现SCRIPT1中ecmascript的功能:把SCRIPT1的CDATA节点删去,把ecmascript改成增添URL脚本。
编程代码如下图所示:(见48javadebug.x3d,48javadebug.x3dv,48javadebug.wrl)
三、 编写Java程序
x48提供了三维场景脚本功能,同以前一样,在Java脚本编程时,我们可以使用程序调试技术,在程序运行时,把其中的一些重要变量在控制台窗口中显示出来。以下是x48.java源代码:
import vrml.*; // Java Script Authoring Interface (JSAI) classes for VRML
import vrml.field.*;
import vrml.node.*;
public class x48 extends vrml.node.Script
{
public static boolean DEBUG = true;//DEBUG allows developers to turn execution-trace messages on/off
private SFBool isActive;
public void initialize () // Initialize scene variables prior to rendering.
{
try {
isActive = (SFBool) getEventOut ("isActive"); // instantiate local eventOut
if (DEBUG) System.out.println ("Java initialize (1): isActive is " + isActive);
} //these System.out.println messages appear in the Java Console window.
catch (Exception e) // Script errors are very hard to debug and will fail silently if not caught
{ // See browser's Java Console for output
System.err.println ("Exception caught in Script node initialize method:");
System.err.println (e);
e.printStackTrace();
}
return;
}
public void processEvent (Event e)
{ //processEvent() is called automatically when the script receives any event
Node node;
try {
if (DEBUG) System.out.println ("==============================");
if (e.getName().equals("set_Active"))
{ param set_Active provides the user's "click" Event ROUTEd into the Script.
ConstSFBool v=(ConstSFBool)e.getValue();
if (v.getValue())
{
isActive.setValue( true);
System.out.println ("isActive is " + isActive);
if (DEBUG) System.out.println ("Mouse down" );
}
else
{
System.out.println ("isActive is " + isActive);
if (DEBUG) System.out.println ("Mouse up" );
}
}
}
catch (Exception exc)
{
System.err.println ("Exception caught in Script node processEvent method:");
System.err.println (exc);
exc.printStackTrace();
}
return;
}
}
四、 Java程序编译运行
Cortona VRML Client 4.X是X3D/VRML浏览器插件,功能强大,完全支持VRML97并扩展了VRML规范(Splines, NURBs, FontStyle, AdvancedAppearance, 拖拽操作, 键盘输入, 三维文本, Real音视频及Macromedia Flash支持),支持Java语言和JavaScript语言;支持基于DirectX 和OpenGL的硬件加速渲染,以及软件渲染;兼容IE、Netscape;支持多用户环境。该插件提供了遵循规范的Java部分和Java EAI规范的Java类库, Cortona VRML client带有corteai.zip、classes.zip,可以与vrml97.jar配合使用。把它们拷贝来一起放在C:\jdk\下,通过设置CLASSPATH来编译使用。用Cortona能正常浏览含class的wrl文件,并在其控制台中显示出调试信息。
Cortona的cortvrml.cab中有classes.zip和corteai.zip,以Internet Explorer浏览器为例,在安装好VRML插件后,可运行注册表编辑器regedit.exe,在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Java VM/Classpath注册项中找到这些类库的文件位置。
编辑一个批处理命令文件javacompiler.bat,内容如下:
set CLASSPATH=C:\jdk\classes.zip;C:\jdk\vrml97.jar;
javac x48.java
把它和要编译的x48.java拷贝至C:\java\bin下,双击执行即可生成x48.class文件。把x48.class文件拷贝到wrl(x3d)文件所在文件夹,即可浏览运行wrl场景文件。
要使用某种VRML浏览器来浏览虚拟场景,就使用该浏览器的类库进行Java文件的编译,形成class文件后与VRML文件放于同一文件夹下,双击VRML文件就可进行本地测试,看能否正常运行。注意:所使用的文件及文件夹要用英文名;若是VRML2.0 Viewer还需要在Classpath注册项中包含有编译后形成class文件的目录,本地测试时才能正常运行,否则将在VRML控制台上出现出错提示:java.lang.ClassNotFoundException: Text(即Text.class文件找不到);另外,如果使用EAI浏览时在VRML控制台或状态栏上显示ClassNotFoundException:vrml.external.browser,则类库可能与其它VRML class文件冲突,此时可通过修改Classpath注册项设置来解决。
五、 存在问题
使用Java以实现动态、交互、三维的WWW虚拟场景时,存在着各VRML浏览器的功能与兼容性问题。
BS Contact 6.1、6.2浏览器不支持Java的脚本节点,浏览wrl文件时,控制台显示信息见下图,可见,ecmascript脚本已执行,但Java脚本未装入。
若打开48javadebug.X3D文件,浏览器中会有静态场景显示,但Java的控制功能不能发挥出来。
Flux控制台中显示:
Loading file:///C:/www.web3d.org/x3d/content/examples/my/48javadebug.X3D...
Done
ecmascript initialize (2):
Loading file:///C:/www.web3d.org/x3d/content/examples/my/x48.class...
Done
可见ecmascript脚本已执行,Java脚本已装入但并未执行。
独立运行的工具包Xj3D不是浏览器插件,只浏览X3D、X3DV、wrl场景,不能浏览htm网页文件,可正常运行48javadebuge.wrl并在Browser console中显示ecmascript输出信息,而Java的输出信息显示在命令行窗口中,可在桌面上快捷方式Xj3DBrowser Java3D的属性中的“目标”文本框中修改为"H:\Program Files\Xj3D\browser.bat" -j3d >log.txt,以记录Java的输出信息。


最新评论
删除 muximu (2008-7-30 10:53:32, 评分: -1 )
删除 homejeky (2008-1-23 11:32:17, 评分: 1 )