引 言
Java3DAPI是用来开发三维图形和开发基于Web的3D应用程序(applet)的编程接口.用于开发三维图形软件的3DAPI(OpenGL、Direct3D)都是基于摄像机模型的铅历橡思想,即通过调整摄像机的参数来控制场景中的显示对象,而Java3D则提出了一种新的基于视平台的视模型和输入设备模型的技术实现方案,即通过改变视平台的位置、方向来浏览整个虚拟场景.它不仅提供了建造和 *** 作三维几何物体的高层构造函数,而且利用这些构造函数还可以建造复杂程度各异的虚拟场景,这些虚拟场景大到宇宙天体,小到微观粒子.
Java3D是JavaMediaAPIs中的一部分,可广泛地应用于各种平台,而且用Java3DAPI开发的应用程序和基于Web的3D小应用程序(applet),还可以访问整个Java类,且可以与Internet很好地集成,即如果在浏览器中安装了Java3D的浏览插件,在网上也可浏览Java3D所创建的虚拟场景.Java3DAPI还汲取了已有图形APIs的优点,即Java3D的底层图形构造函数不仅综合了底层APIs(Direcrt3D、OpenGL)最好的绘制思想,而且它的高层图形绘制还综合了基于场景图的思想,同时,它又引入了一些通用的图形环境所未考虑的新概念(如3D立体声),这样将有助于提高用户在虚拟场景的沉浸感.本文将着重介绍Java3D针对VR应用所提出的基于视模型和输烂升入设备模型的新思想,在此基础上又讨论了如何利用Java3D来开发VR应用程序及其实现方法,并设计实现了一个应用实例.
1.适于VR应用开发的Java3DAPI众所周知,开发VR应用程序是一件很繁琐的工作,其开发人员必须编写应用程序可能遇到的各种输入和显示设备的接口程序,或者依赖专为VR应用开发而设计的应用程序编程接口(API),且典型的VR应用必须跟踪用户的头部位置和方向,以生成与头部位置方向相一致的虚拟场景图.
另外,还需要先跟踪身体的其它部位(手、臂或腿部),然后通过身体各部位在虚拟场景中的虚拟视点与场景中的对象进行交互,而应用程序也必须具有能够利用跟踪输入设备在视点内放置物体,并标明其在生成的三维图象中的位置和方向的功能.同时,面向VR的应用程序开发接口(API)必须能支持3D图形生成、处理跟踪器的输入,并能将跟踪信息反馈到图形绘制中.
Java3DAPI可自动将头部跟踪器的输入集成到图形生成中,并具有通过访问其它跟踪器信息来控制其它特征的功能,但它是通过一种新的视模型(viewmodel)技术来实现的.该视模型是将用户真实的物质环境与计算机生成的虚拟环境相互独立,并建立它们之间的通信桥梁.该API也明确定义了用来探测Java3D物体六自由度(6DOF)传感器的返回值,并将其应用于显示场景图中.总之,这种新的视模型和输入设备模型可以很方便地将交互式的3D图形应用程序转化为VR应用程序.
Java3D视模型
2.1 新的视模型概念(viewmodel)基于摄像机的视模型是模仿虚拟环境中的摄像机,而不是虚拟环境中人的“替身”,而且它是通过控制摄像机与视点的相关参数来控制所显示的场景,但这种方法,在用户物质环境确定某些视参数的系统中是不合理的,例如在头盔显示器(HMD)系统中,HMD的光学性能就直接确定了应用程序所显示的视域.由于不同的HMD有不同的光学特性,因此如果允许终端用户随意改变光学参数显然是不合理的.这里视参数的值将随终端用户物质环境的不同而不同,而影响视参数的主要因素有显示器大小、显示器的位置(戴在头上,还是放在桌子上)、三维空间中用户的头部位置、头盔显示器的实际显示视域、每英寸的显示象素等.由于Java3D的视模型直接提供了头部跟踪的功能,因而使用户产生了真实存在于虚拟环境中的错觉.
Java3D不仅提出了新的基于视平台的视模型概念,同时将其槐旁推广到包括显示设备和6DOF外围输入设备(如头部跟踪器等)的接口支持中,而且新的视模型继承了Java的“writeonce,vieweverywhere”本质.这意味着由Java3D视模型开发的应用程序或applet可广泛地应用于各种显示环境.这种显示环境可以是标准的计算机显示屏、多元显示空间,也可以是头盔显示器.Java3D视模型是通过将虚拟环境和物质环境完全独立的方式来实现上述功能的,且该视模型可将虚拟环境中视平台的位置、方向和大小,与Java3D绘制的与视平台位置、方向相一致的虚拟场景相区分.一般应用程序控制视平台的位置和方向,而绘制着色系统则依据终端用户的物质环境以及用户在物质环境中的位置和方向来确定显示场景.
2.2 视模型的组成
Java3D视模型由虚拟环境和物质环境两部分组成,其中,虚拟环境由ViewPlatform对象来表示,它是虚拟对象存在的空间而物质环境则由View对象以及和它相关的对象来表示.这里,View对象和它的相关对象就描述了用户所处的显示和 *** 纵输入设备环境.虽然视模型将虚拟环境和物质环境相互独立,但可通过一一对应关系来建立两种世界之间相互通信的桥梁,这样将使得终端用户的行为会影响虚拟环境中的对象,同时虚拟环境中的对象行为也会影响终端用户的视点.
Java3D可通过几个对象来定义视模型参数.这些对象包括View对象及其相关对象、PhysicalBody对象、Canvas3D对象、PhysicalEnvironment对象、Screen3D对象.视模型相关的对象(如图1所示)其作用如下:ViewPlatform用来标志场景图中视点位置的节点.其父节点则指明了视平台在虚拟环境中的位置、方向和大小.View用于指定需要处理场景图的信息.Canvas3D定义了Java3D绘制图象的窗口,它提供了Canvas3D在Screen3D对象中的大小、形状和位置信息.Screen3D用于描述显示屏幕的物理属性.PhysicalBody用于封装那些与物质体相关的参视模型的组成及其相互关系数(如左、右眼的位置等).PhysicalEnvironment用于封装那些与物质体环境相关的参数(如,用于头状物体或头盔式跟踪器的校验信息).
2.3 虚拟环境中的视平台(ViewPlatform)
鉴于视平台定义了一坐标系统,于是虚拟环境中的原始点和参考点就有了一参考坐标系.这里视平台代表与视对象相关的一个点,并充当确定绘制图象的基础.图2显示了包括视平台节点场景图的一部分.由图2可见,视平台的父节点确定了视平台在虚拟环境中的位置和方向.若通过修改与TransformGroup节点相关的Transform3D对象,就可以在虚拟场景中随意移动视平台.虽然虚拟环境中可以有许多不同的视平台,但特定的视对象只能与一个视平台相关联,于是在Canvas3D对象中所绘制的场景均来自于一个视平台的视点.这样应用程序就可通过修改视平台的TransformGroup节点,在虚拟环境中漫游.图2 包括视平台的局部场景图3 Java3D的输入设备模型Java3D除了支持通用的键盘、鼠标输入外,还能给各种不间断的输入设备,如6DOF跟踪设备和 *** 纵杆提供支持.由于不同的跟踪输入设备其工作原理不同,因而计算机与其交互的方式也不同.为了给不同的6DOF输入设备提供支持,Java3D还提供了一个输入设备接口,而且该输入设备接口还定义了一个抽象的输入设备,虽然用其可以实现对一特定设备的驱动,但输入设备接口的实现必须实现接口所定义的所有方法(如设备开、关、读取 *** 作、状态设置及查询等).Java3D的输入设备列表就用这些方法同特定的设备进行交互.
一般Java3D环境中,可能包括许多输入设备,而且这些输入设备不一定是实际的物理设备,也可能是虚拟设备,例如通过软件的方法将鼠标的运动参数转化为6DOF虚拟跟踪球的参数,来模拟虚拟跟踪球的输入.由于所有的输入设备都由许多传感器对象组成,因此每一种输入设备都与一定数量的传感器对象相关,且每一种传感器都与其传感器设备6DOF数据的一个数据源相关.当输入设备驱动的数据改变时,传感器对象的数据也会相应改变,而且传感器对象由读取传感器对象组成.由于缓冲区中记录了各传感器N个读取传感器对象的值,因此可以对传感器数据进行平均,以及对传感器输入值的趋势进行预测等处理,但应用程序的开发并不直接使用输入设备.Java3D是通过一个传感器数组将输入设备抽象化,传感器对象数组是物质环境对象的一个子类,该数组是由与输入设备相关的对象指针组成.Java程序可以直接从传感器数组中获取传感器的值,并将其用到场景图中,或按任意方式对其进行处理。
2.4 用Java3D开发VR应用程序利用
Java3D开发的VR应用程序或者applets程序,可建造一个虚拟场景,并能将一个或多个场景图插入到虚拟场景中,虚拟场景由超结构对象集组成,对象集则包括一个世界对象(Universeobject)、一个或多个场所对象(Localeobjects)和按树状结构排列的由节点物体组成的一个或多个场景图(Scenegraphs).该场景图又称为分枝图(Branchgraph),它包括绘制对象节点、光照节点、行为节点和声音节点等,其中,包含内容节点的分枝图称为内容分枝,包含视平台对象的分枝图称为视分枝,视平台对象用来确定用户的位置和方向.图3表示了具有多分枝图的Java3D场景.图3 应用程序场景图由于这种分枝图只描述了场景所要绘制的对象,并不确定对象的绘制次序,因此图中节点的次序和位置与对象的绘制次序无关,而图中的父节点和子节点的直线路径就唯一确定了子节点的图形范围.由于绘制次序的不确定性,因而使得Java3D能横越场景图的任何次序,且它能从左到右,从顶部到底部穿过场景图或者从右到左,甚至并行遍历整个场景图.Java3D的分支图为树状结构,且图中的每一个节点只有一个父节点.这样通过辅助的场景图机制就可以实现通用场景图的共享,而且具有连接属性的叶节点可以连接到共享子图.分枝图中的节点分为群节点(groupnode)和叶节点(leafnode)两类,其中,群节点按照粘贴的原理来组织场景图单元。
群节点的层次结构图一般群节点包括:BranchGroup、TransformGroup、Switch、OrderGroup、DecalGroup和ShareGroup节点,其中,BranchGroup是分枝图的根节点而TransformGroup用来指明所有子节点的位置和方向Switch则用于实现一个或多个子图的转换OrderGroup用于使它的子节点按照特定的次序绘制DecalGroup是OrderGroup的一个子集ShareGroup跟BranchGroup一样,是一个场景图的根节点.虽然共享图作为Java3D场景图的一部分从不直接出现,但是连接节点可以引用.另外群节点还可以包含各种子节点以及所包含对象的群节点或叶节点.这些子节点用一个关联索引属性来允许对特定的子节点进行 *** 作.如果没有指明特定的顺序群节点,Java3D还可以按照任意指定的顺序来绘制群节点的子节点.虽然叶节点是场景图的抽象类,它没有子节点,但叶节点包括了Java3D的各种信息.叶节点由Shape3D、ViewPlatform、Sound、Light以及用户定义的行为节点等组成,Shape3D和ViewPlatform节点在Java3D的视模型和输入模型中扮演着重要的角色,因为它描述了图形系统的两个重要方面,其中,Shape3D描述了场景中对象的几何形状,而ViewPlatform则标定了用户或其视点在虚拟环境中的方向或位置.
另外,应用程序还可像 *** 纵分枝图中的任意对象一样,来 *** 纵ViewPlatform,而且应用程序还可平移、旋转和缩放ViewPlatform,即通过改变ViewPlatform的位置和方向,ViewPlatform将随同用户的视点一起移动,来浏览整个虚拟环境.虽然ViewPlatform是按照事先规定的路线浏览场景,但不会限制用户视点的移动和向不同方向浏览场景.
1、下载安装 JDK程序:jdk-1_5_0_07-windows-i586-p.exe2、设置环境变量:方法为“我的电脑”属性---高级---环境变量
增加“CLASSPATH”内容为“.I:\Program Files\Java\jdk1.5.0_07\lib\tools.jarI:\Program Files\Java\jdk1.5.0_07\lib\dt.jard:\class”。注意安装位置路径!
增加“JAVA_HOME”内容为“I:\Program Files\Java\jdk1.5.0_07”
在PATH中添加“I:\Program Files\Java\jdk1.5.0_07\binI:\Program Files\Java\jdk1.5.0_07\jre/bin”在前面加的。
3、进入CMD,在任意盘符下试运行JACAC看是否正常。要多试几次的。可进入JAVAC所在目录运行先。
4、如果路径没问题,可以在记事本上输入
public class HelloJAVA
{
public static void main(String[] args)
{
System.out.println("Hello JAVA!")
}
}
更名为HelloJAVA.java,放在D:/CLASS
5、在CMD后运行
D:\CLASS\javac hellojava.java(称作编译)
成功后
D:\CLAS\java HelloJAVA (注意大小写!就是这里我费了基扰一些脑筋,就会报:Exception in Thread main java.lang.NoClassDefFoundError)
应该出现 Hello JAVA!!字样,至此,JAVA JDK环境基本完工。
以上是查了网上资料,但是也有相当初学者遇到纳锋迅麻烦,不知本人的 *** 作有什么问题吗。有一点,如果不是亲身实践那么总以为容易的。
6、下载并安装程序:java3d-1_5_1-windows-i586.exe
这个程序与前面的JDK安装先后不能搞错。这时安装可见到本程序自动发现JDK的安装路径。默认在C:,无法更改的样子。
7、在D:/CLASS下建立文本文件,内容为:
import java.applet.Applet
import java.awt.BorderLayout
import com.sun.j3d.utils.applet.MainFrame
import com.sun.j3d.utils.geometry.*
import com.sun.j3d.utils.universe.*
import javax.media.j3d.*
import javax.vecmath.*
import com.sun.j3d.utils.behaviors.mouse.MouseRotate
import com.sun.j3d.utils.behaviors.mouse.MouseZoom
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate
public class UglyCube extends Applet
{
private SimpleUniverse universe
public UglyCube()
{}
public void init()
{
//canvas to draw on, ask SimpleUniverse what config to use
Canvas3D canvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration())
setLayout(new BorderLayout())
add("Center", canvas)
//create top of our scene graph
BranchGroup scene = new BranchGroup()
/洞此/create universe, and attach our geometry to it.
SimpleUniverse u = new SimpleUniverse(canvas)
u.getViewingPlatform().setNominalViewingTransform()
// Create the bounding leaf node
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0)
// Create the transform node
TransformGroup transformGroup = new TransformGroup()
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ)
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE)
// Create the drag behavior node
MouseRotate behavior = new MouseRotate()
behavior.setTransformGroup(transformGroup)
transformGroup.addChild(behavior)
behavior.setSchedulingBounds(bounds)
// Create the zoom behavior node
MouseZoom behavior2 = new MouseZoom()
behavior2.setTransformGroup(transformGroup)
transformGroup.addChild(behavior2)
behavior2.setSchedulingBounds(bounds)
// Create the zoom behavior node
MouseTranslate behavior3 = new MouseTranslate()
behavior3.setTransformGroup(transformGroup)
transformGroup.addChild(behavior3)
behavior3.setSchedulingBounds(bounds)
transformGroup.addChild(new ColorCube(0.4))
scene.addChild(transformGroup)
u.addBranchGraph(scene)
}
// The following allows UglyCube to be run as an application
// as well as an applet
public static void main(String[] args)
{
new MainFrame(new UglyCube(), 256, 256)
}
}
然后把它把保存更名为UglyCube.java,然后用进入CMD
D:\CLASS\JAVAC UglyCube.java(编译)
D:\CLASS\JAVA UglyCube (运行)
运行结果:这是个彩色六面体,可以用鼠标左键旋转,右键拖动,摁下滚轮前后移动缩放。
测试Java3D开发运行环境是否配置正确工作至此完成。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)