java3d_API_java3d_programming

合集下载

Java3D类简单说明

Java3D类简单说明

Java3D类简单说明很长时间没有听到关于Java3D的消息了,好像Sun已经放弃了Java3D一样,不过Java3D 作为一门纯正的面向对象的3D技术,还是很值得我们学习和使用的。

不过话说回来Java3D 开发的真是比较粗糙。

下面介绍些Java3D常用的类吧。

Canvas3D 类Canvas3D 类继承自Abstract Windowing Toolkit (AWT)类的Canvas类.在场景图的视图分支图中,至少要引用一个 Canvas3D对象(注:有可能存在多个Canvas3D对象,为了使演示简单,在使用SimpleUniverse类时,在程序中仅有 Canvas3D类的一个实例)。

关于Canvas 类更多的信息,请参考AWT。

附录B中提供了一系列参考。

Canvas3D 类的构造函数Canvas3D(GraphicsConfiguration graphicsconfiguration) 构造并初始化一个新的Canvas3D对象,Java 3D可以在给定的GraphicsConfiguration对象条件下渲染这个对象。

这是 AWT Canvas类的扩展的类。

关于GraphicsConfiguration 对象的更多信息请参考Java 2D规范。

这也是JDK 1.2 AWT的一部分。

Transform3D 类Transform3D 对象用于进行3D几何形变比于平移和旋转。

这些对象一般仅仅用于创建一个TransformGroup对象。

首先, Transform3D对象可能基于一些Transform3D对象的组合而创建,然後就用这个Transform3D来构建一个] TransformGroup对象。

Transform3D默认的构造函数一个通常的变换对象就表示为一个4x4双精度浮点矩阵。

这种数学表示是以行为主的。

一个Transform3D对象不是在场景图中用到的,而是用于指定TransformGroup对象的图形变换的。

Java3D总结

Java3D总结

Java3D介绍Java3d是适应与internet 环境下开发的三维图形开发包,它针对底层库openGL 和DirectX 的封装。

这样使得他们摆脱了单机三维束缚,面向与网络方向。

OpenGL :图形编程库。

(如坐标的变化,基本形体,关照效果等)DirectX :微软公司三维库传统下的Internet 图形处理,数据不是从本地硬盘中读取,运行环境也不是事先安装好的,如果用OpenGL 等传统的可视手段,只能在Web服务器端生成图像,在发到客户端显示。

但是当前的网络传输能力是不可能满足的。

(但是java3的是传输的不是图像本生,而是三维图像生成的程序和数据)当前下的Java3d是这样的:java3d是基于OpenGL或DirectX底层的API。

他和java 一样需要安装,jre(java虚拟机)一次编程,跨平台运行。

所以说他很好的运用了pc机的硬件加速器。

(当前我们现在用的是WebStart来下载java3d程序,他保证了如果服务器端没有升级变化时,只需要下载一次,以后就可以直接运行)。

Java3d 本质是一个交互式三维图形应用编程接口(api),他可以和java2d,swing,awt 结合。

其目标是:让用户在浏览器中观看或操作三维动画图形。

一次编程,到处运行。

适应不同的软件平台。

适应各种显示环境和输入设备。

Java3d的编程思想Java3d编程的空间采用场景图结构,是一种有向无环图。

如图:locale下有一到多个branchgroup节点,在他下有一个基准坐标系transformgroup,就可以相对此坐标系摆放所需的形体(shape3d)也可以给出形体的外观appearance及geometry。

所以:他就是将许多对象安放在这个虚拟空间的过程,在设置各个方面的属性,如:形状,位置,外观,贴图,透明效果等;再在三维环境下设置灯光,雾,背景,声音等。

最后定义我们自己的观察角度,最终达到效果。

编写Java3D程序的一般步骤

编写Java3D程序的一般步骤

编写Java3D程序的一般步骤SceneGraphObject类的子类就是集成构建场景图的模块,一个Java3D程序的开发大略可以分为七步(把它们聚在一起,在Java 3D API 规范中和这里称之为步骤(recipe)),具体如下列表所示,这些方法可用于装配许多的Java3D程序。

1. 创建一个Canvas3D对象。

2. 创建一个VirtualUniverse对象。

3. 创建一个Locale 对象,并使之与VirtualUniverse相关联。

4. 构建一个视图子图。

a. 创建一个View 对象。

b. 创建一个ViewPlatform对象。

c. 创建一个PhysicalBody对象。

d. 创建一个PhysicalEnvironment对象。

e. 把 ViewPlatform, PhysicalBody, PhysicalEnvironment, 和Canvas3D对象与View 对象相关联。

5. 构建一个或多个内容子图。

6. 编译所有子图。

7. 把子图加到Locale对象中。

表 1-1 编写Java3D程序的一般步骤这些步骤忽略了细节但是解释了Java 3D编程中的基本概念。

创建场景图中的子图是编程的主要部分。

但我们并没有展开这些步骤详细讨论,本教程的下一部分解释了一种用更少的代码更容易的手段来构建一个非常简单的场景图的方法。

1.4.1 编写Java 3D程序的一个简单方法用基本方法编写具有视图分支图的Java 3D programs程序的结构有其唯一性,构建视图分支子图结构的规则可以通过SimpleUniverse工具类来实现. SimpleUniverse 的实例承担了构建场景图的基本步骤中的第2, 3以及第4步。

利用SimpleUniverse类来进行Java3D编程,可以大大减少创建视图分支图的时间和精力,从而,程序员可以有更多的时间来构建内容分支子图,这才是真正与Java3D程序事关重大的。

java3D

java3D

Java3d整理Java3d基础环境配置1.1安装JDK1.2安装官网下载最新版本简单实例2.1新建java项目2.2导入基本jar包,jar包下载2.3编写代码package measoft.java3d.base;import java.applet.Applet;import java.awt.BorderLayout;import java.awt.GraphicsConfiguration;import javax.media.j3d.Appearance;import javax.media.j3d.Background;import javax.media.j3d.BoundingSphere;import javax.media.j3d.BranchGroup;import javax.media.j3d.Canvas3D;import javax.media.j3d.DirectionalLight;import javax.media.j3d.Material;import javax.media.j3d.TransformGroup;import javax.vecmath.Color3f;import javax.vecmath.Point3d;import javax.vecmath.Vector3f;import com.sun.j3d.utils.applet.MainFrame;import com.sun.j3d.utils.geometry.Cone;import com.sun.j3d.utils.universe.SimpleUniverse; /*** 使用了SimpleUniverse对象,使得基本步骤比较简单:* 1.创建一个Canvas3D对象。

* 2.创建并定制一个SimpleUniverse对象,该对象引用前一步创建的Canvas3D对象* 3.构建内容子图* 4.编译内容子图* 5.将内容子图插入SimpleUniverse的Locale中*** @author J_nan**/publicclass MyCone extends Applet {public BranchGroupcreateSceneGroup(){/*** 一、 1.创建一个包含对象的数据结构2.生成坐标系3.将坐标系添加到跟节点上4.设置场景的有效范围*/BranchGroupobjRoot = new BranchGroup();TransformGroupobjTrans = new TransformGroup();objRoot.addChild(objTrans);BoundingSphere bounds = new BoundingSphere(newPoint3d(0.0,0.0,0.0),100.0);/*** 二、1. 创建背景颜色 2.设置背景边界 3.添加背景到场景中*/Color3f bgColor = new Color3f(0.0f,0.0f,0.0f);Background bg = new Background(bgColor);bg.setApplicationBounds(bounds);objRoot.addChild(bg);/*** 三、1. 添加平行光 2.给指定的bounds设定光的范围界限*/Color3f directionalLightColor = new Color3f(1.f,1.f,1.f);Vector3f vec = new Vector3f(0.f,0.f,-1.0f);DirectionalLightdirectionalLight =new DirectionalLight(directionalLightColor,vec);directionalLight.setInfluencingBounds(bounds);objRoot.addChild(directionalLight);/*** 四、1.设置外观 2.设置材料 3.生成基本圆锥*/Appearance app = new Appearance();Material material = new Material();material.setDiffuseColor(new Color3f(10.f,1.0f,0.0f));app.setMaterial(material);Cone cone = new Cone(.5f,1.0f,1,app);objRoot.addChild(cone);/*** 五、返回objRoot*/return objRoot;}public MyCone(){setLayout(new BorderLayout());GraphicsConfigurationconfig =SimpleUniverse.getPreferredConfiguration();/*** 第一步:Canvas3D类提供了一个3D渲染绘图画布,构造并初始化一个新的Canvas3D对象*/Canvas3D c = new Canvas3D(config);/*** 第二步:创建虚拟空间*/SimpleUniverse u = new SimpleUniverse(c);/*** 第三步:构建内容子图*/BranchGroup scene = createSceneGroup();/*** 第四步:编译内容子图*/pile();/*** 第五步:将内容子图插入SimpleUniverse的Locale中*/u.addBranchGraph(scene);add("Center",c);//安放观察点u.getViewingPlatform().setNominalViewingTransform();}publicstaticvoid main(String[] args) {new MainFrame(new MyCone(),400,300);}}运行效果如图:编写JAVA3D程序的一般步骤:A.SceneGraphObject的子类是构建场景图的基石。

Java 3D编程

Java 3D编程
Java 3D 编程之圆柱体
疑问:Java 3D之 物体的构建问题

1.骨架构建:如何构建要仿真的物体骨架? 2.贴图(蒙皮):当物体的骨架搭建完成后,如 何是物体外形接近真实的物体呢?
Java 3D 之 骨架


1.使用Java 3D中的现有的形体,构建出物体 的骨架 2.可以借用第三方工具(Maya、3D Max)形成 物体的骨架
Java 3D 编程之圆柱体

import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.DirectionalLight; import javax.vecmath.Color3f; import javax.vecmath.Point3d; import javax.vecmath.Vector3f; import com.sun.j3d.utils.geometry.Cylinder; import com.sun.j3d.utils.universe.SimpleUniverse; public class MyCylinder { public MyCylinder (){ //构建空间 和物体 // 创建一个虚拟空间 SimpleUniverse universe = new SimpleUniverse(); // 创建一个用来包含对象的数据结构 BranchGroup group = new BranchGroup(); // 创建一个圆柱形状并把它加入到group中 Cylinder cylinder=new Cylinder(.5f,1.0f); //圆柱型 group.addChild(cylinder); //灯光构造 Color3f light1Color = new Color3f(1.8f, 0.1f, 0.1f); // 设置光线的颜色 BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0); // 设置光线的作用范围 Vector3f light1Direction = new Vector3f(4.0f, -7.0f, -12.0f); // 设置光线的方向 DirectionalLight light1= new DirectionalLight(light1Color, light1Direction); // 指定颜色和方向,产生单向光源 light1.setInfluencingBounds(bounds); // 把光线的作用范围加入光源中 group.addChild(light1); // 将光源加入group组 // 安放观察点 universe.getViewingPlatform().setNominalViewingTransform(); // 把group加入到虚拟空间中 universe.addBranchGraph(group); } public static void main(String[] args) {

Java3D基本图形功能介绍

Java3D基本图形功能介绍

1.1Java3D的虚拟场景空间设计Java3D是一种面向对象的API。

通过场景图来管理场景中的各种图形元素。

场景图是一个树状结构,在该树状结构的各级节点表示该场景中的各种图形元素。

将由各种图形元素形成的一个场景的整体称为一个虚拟空间。

在这个虚拟空间中的图形元素包括:几何体的定义数据,几何显示时的颜色、材质、透明度等属性,背景颜色,光线类型,场景的作用范围,视点、投影面及投影类型,对几何体的坐标变换等。

Java3D与Java一样对各种功能的组织同样采用父类、子类、对象实例的方式。

Java3D中规定了在一个虚拟场景空间中各种图形元素的表示符号及虚拟场景空间的组织结构。

在一个虚拟空间中可以包含多个Local节点。

一个Local节点表示一个子场景的根节点。

多个Local节点表示在该虚拟场景中有多个场景的根节点。

但是在实际应用中最常使用的是在一个虚拟空间中只包含一个子场景,也就是只包含一个Local节点。

在一个Local节点之下,可以包含一个到多个BranchGroup节点。

每个BranchGroup 节点表示一种图形元素的集合。

这种图形元素的集合主要有两种:(1)定义几何体的数据与定义该几何体的颜色、材质、透明度等外观的属性;(2)定义该几何体在显示的时候在该场景中的其他元素,如背景颜色、光源类型、视点位置与观察方向、投影平面的位置、坐标变换等。

在实际应用中,最常用的是一个Local 节点下只含有一个BranchGroup节点。

在一个Local节点下只含有一个BranchGroup节点情况下,必须定义一个Shape3D对象,在该对象中定义几何体的数据与几何体的颜色、材质、透明度等外观显示特性,该Shape3D对象一般加入在一个TransformGroup类的节点中。

在一个BranchGroup 节点之下,可以包含多个TransformGroup节点。

每个TransformGroup节点可以包含以各种或多种几何体的定义。

Java3DAPI官方教程

Java3DAPI官方教程Java 3D API官方教程开始学习Java3D API第一章、入门本章目标:学习了本章之后,你能:能用一些基本术语解释什么是Java3D能描述出Java3D程序的基本结构。

能识别出Java3D API中的许多类。

能编写出简单的Java3D动画程序。

Java 3D API是一个用于编写显示和交互操作三维图形对象的程序的接口。

Java 3D也是在Java2 Java开发包(JDK)上的标准扩展。

这个API提供了用于创建和操纵3D图形的高端构成方法以及渲染该图形的一些数据结构。

Java3D 提供了创建图片、可视化、动画以及3D 交互图形应用程序的函数。

1.1 什么是Java 3D API?Javae 3D API是作为复杂三维图形和声音渲染系统的接口的一系列层次的JAVA类的统称。

程序员可以用Java3D开发创建和操纵3D图形对象的高端应用。

这个图形对象处于一个被渲染了的虚拟世界(Virtual Universe)中。

这个API就是用设计来用于灵活方便地创建精确的各种大小的虚拟环境,可以大到大空物体,小到比原子还小。

除了这些功能之外,API的使用也很直接,API能自动处理渲染的细节,由于利用了Java线程机制的优势,所以Java3D的渲染器的工作是并行进行的。

并且渲染器也能自动地优化并提高渲染性能。

一个Java3D程序创建了Java3D对象的实际,并将其置之于场景图数据结构中。

在这个场景图中,所有3D对象用完全指定了虚拟世界内容和其如何被渲染的树形结构存储,Java3D程序能写成能独立运行的应用程序,或者写成能嵌入在浏览器中运行的Applets,或者二者兼备。

1.2 Java 3D API每一个Java3D程序至少部分地集成了来自Java类层次中的对象,这些对象的集合称做虚拟世界(virtual universe),这就是将要被渲染的对象。

此API在javax.media.j3d包中定义了超过100多个类,这些类我们平常称做Java3D核心类。

JAVA教程

Java3D探奇2007年12月07日星期五00:02本教程是为没有任何3D编程经验的Java程序员而编写的。

我们将从一些基本的3D概念入手,探索如何构建一副场景图—用于描述我们想要渲染的场景的基本对象。

然后,我们将接触Java3D的一些更强大的功能。

我们的重点将放在使用一些Java3D实用类来开始您的编程。

预备知识对3D编程没有任何经验的程序员都可以是本教程的读者。

系统需求浏览器:Netscape4.x或更高版本,或者Internet Explorer4.x或更高版本,支持Javas cript。

思想Java3D API的设计是对以前流行的诸如OpenGL和Direct3D的3D图形API的重大革新(以前的API是同3D硬件设计紧密结合的低级过程性API)。

Java3D是一种功能强大的、面向对象的API,它提供了许多超出我们认为作为“3D图形API”所能有的功能。

Java程序员可能会发现Java3D编程环境非常熟悉而且易用。

Java3D做了许多事情来为您管理图形数据,这样就使得您可以把精力集中在其它编程工作上。

使用Java3D,首先要在场景图中设置所有的图形对象(也称为几何对象),场景图是一个层次模型,它包含有关场景中的对象以及如何渲染它们的全部信息。

然后,将该场景图交由Java3D渲染。

您无须为显示数据而编写任何代码―Java3D为您完成了这项工作。

通过使用内置的强大工具,您可以在一个更高的级别上进行编程。

对速度的需要3D程序员十分在意性能,这是有其原因的―他们的应用程序往往对性能非常敏感。

如果旋转的CAD模型没有平滑地旋转,或者3D应用程序用户不能够交互地抓取一个对象并移动它,用户将会立即注意到这一点。

令人欣慰的是,Java3D能够利用图形适配器所提供的任何3D加速性能。

Java 3D最终会在JNI层生成可以由图形卡加速的OpenGL调用。

新工作站通常装有OpenGL加速适配器,因此您的Java3D程序应该可以由硬件加速。

java3D安装教程

在Eclipse中运行Java3D的程序此页解释了如何在Eclipse中使用Java3D的库运行程序。

1.下载Java3D的。

访问此网页下载为您的系统Java3D的库。

2.下载用于Windows包含一个安装程序。

我发现最简单的安装在我的Java文件夹,包含在我的情况同一个标准的Java,jdk1.6.0_18下载Java3D的文件和目录。

在运行安装程序:3.启动Eclipse。

你可以创建一个Java3D的代码为您的新项目,或使用一个已经存在的项目。

我将创建一个新的名为3DExamples 项目4.下载HelloUniverse.java和添加项目,从第3步。

HelloUniverse.java有很多语法错误,因为它是指一些Java3D的非标准类。

我们需要告诉到哪里寻找这些类的项目。

5.在Eclipse菜单,选择“项目” - >“属性”6.在弹出窗口中选择 Java Build Path,然后单击 Add Library ...“按钮。

7.在下一个窗口中,选择用户库,点击“下一步”按钮。

8.在下一个窗口中单击“用户库”...“按钮9.在未来的点击新建...“按钮。

10.在窗口,弹出新的库名称。

使用名称Java3DLib。

然后单击“确定”按钮。

11.选择您刚才创建的库,然后单击“添加JAR文件...”按钮。

12.在弹出浏览文件夹,你在第2步安装Java3D的文件选择。

(Java3D的jar文件的路径在我的机器是用Java3D - > 1.5.2 - >库- >分机- >)选择所有三个jar文件(j3dcore.jar,j3dutils.jar,和vecmath.jar的)。

所有三个jar文件,选择后单击“打开”按钮13.后加入的罐子在首选项窗口点击的好吧按钮。

14.在弹出的窗口中单击 Finish按钮。

15.在构建路径“窗口中选择回到您刚才添加的Java3DLib,展开它,并选择本机库的位置属性。

第13章 VRML(虚拟现实建模语音)其他虚拟现实开发技术和软件介绍


三 与其他虚拟现实开发语言的比较
Java 3D
Java 3D是在OpenGL三维图形库的基础上发展而来的,Java3D API (Java Three-Dimension Application Programming Interface)是用于实现基于 Web的三维图形显示和应用程序开发的Java编程接口,它具备了从网络设备 编程到三维几何图形编程等各方面的功能。 Java3D继承了OpenGL的层次结构,并兼有Java语言结构的较完美形式, 使其具有以下一些的特点:(1)Java 3D结合了高层次的场景图(Scene Graph)模型,使得程序员不必花费时间和精力来设计具体的几何形体和编写 描绘代码,只需集中精力于场景图中各个对象和组成元素。(2)Java3D继 承了Java的平台无关性,采用了几何形体的压缩技术,加快了三维模型的网 络传输速度,适合于开发基于Intranet/Internet的应用。(3)它支持多 种文件输入格式,能实现对3D图示数据的高性能处理,实现对于挑选、删除 等操作的优化处理。(4)Java3D把OpenGL和DirectX这些底层技术包装在 Java接口中,这种全新的设计使3D技术变得不再繁琐并且可以加入到J2SE、 J2EE的整套架构,这些特性保证了Java3D技术强大的扩展性。
最适合应 用领域 网上三维 显示 三维设计 软件 三维游戏 网上虚拟 现实
三 与其他虚拟现实开发语言的比较
DIRECT3D DIRECT3D是Microsoft公司推出的三维图形编程API,是DirectX的成 员之一。顾名思义,他是DirectX中负责实现3D图形绘制的部分,它主 要应用于三维游戏的编程。众多优秀的三维游戏都是由这个接口实现 。与OpenGL一样,Direct3D的实现主要使用C++语言。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Getting Started with the Java 3D™ APIChapter 1前言:如对译文中有不同理解的地方请参考原著,水平有限,请见谅,谢谢1.3构造一个场景图一个java 3d虚拟宇宙是由一个由JA V A 3D类的实例构成的场景图构造出来的,场景图由许多对象聚集在一起去定义几何体,声音,光线,位置,方向,虚拟的外观和音频对象对于图的一般定义可以说是包含结点和弧线的数据结构,一个结点就是一个数据元素,弧线代表的就是数据元素之间的关系。

在场景图的一个结点代表JA V A 3D的一个类的实例,弧线代表JA V A 3D实例之间的两种关系。

最普遍的一种关系就是父子关系,一个(group node)组结点可以有很无限多个子类但只能有一个父类,一个(leaf node)叶子结点可以有一个父类但不能有子类,另外一种关系就是引用关系,一个引用关系把一个(NodeComponent)结点组件对象和一个(scene graph Node)场景图结点连系起来,NodeComponent objects定义用来渲染视觉对象的几何体和外观属性一个 java 3D场景图由父子关系的Node对象构成,最后形成一个树形结构。

在一个树结构中,有一个称为根结点的结点,其它结点从根结点一直往下延伸。

一个树的弧线不能形成回路,一个场景图起源于(Local objects)的根结点,(NodeComponents)和(reference arcs)不是场景场的部分。

从一个树的根结点到叶子结点只存在一个路径,因而,从场景图的根到每一个子叶结点只有一条路径。

从场景图的根到指定的叶子结点称为叶子结点的场景图路径。

由于一条场景图路径只通向一个确定的结点,所以在场景图中对于每个结点都只有一条场景图路径。

在一个javad3D场景图中每一个场景图路径都完全载明了它的叶子的状况信息。

状况信息包括位置,方向和视觉对像的大小。

因此,每一个视觉对象的视觉属性都依附于场景图路径。

java3d渲染器充分利用了这个事实而从被认为是最有效的顺序去渲染叶子结点。

java3d程序员不必操心去支配对象的渲染顺序。

一个场景图的图表的表示可以作为JA V A3D的设计工具和文档说明。

我们可以用标准的图形符号来画场景图,如图1.1.java3d程序可以有比这场景图更多的对象。

我们可以用标准的符号来设计一个JA V A3D虚拟宇宙的场景图。

在设计完成之后,场景图的制图可以作为这程序的文档说明。

在程序完成之后,对应的场景图就是程序的一个简明的表示。

图 1.1左手边的每个符号代表在场景图中使用的单一的对象,最前面的两个符号代表确定的类:VirtualUniverse and Locale.接着下来的左边的三个符号代表类Group, Leaf, and NodeComponent的对象。

这三个符号通常也被注释代表这三个类的子类的对象。

在左边的最后一个符号是用来代表其它类的对象。

实线箭头符号代表两个对象之间的父子关系,点箭头是对其它对象的引用。

被引用的对象可以在一个场景图中的不能分支共享。

图1.2表示了一个简单的场景图创建一个不合法的场景图是有可能的。

图1.3表示了一个不合法的场景图例子。

因为它违反了DAG特性。

问题只出在于两个TransformGroup objects同时拥有同一个Shape3D leaf object 作为孩子。

记住一个Leaf object只能有一个老爸。

换句话说,从Locale object到a leaf只能有一条路径(或者说从a leaf到a Locale只有一条路径)你可能想,图1.3表现出来的结构中定义了一个虚拟宇宙的三个视觉对象。

在图1.3右边可以看出,它看起来好像是这个场景图通过重用了visual object(Shape3D)定义了两个视觉对象。

概念上,共享的Shape3D实例的两个父类TransformGroup objects都可以把视觉对象的画面投影到不同的位置。

但是,由于父-子弧线不能形成一棵树,所以它是一个不合法的场景图。

在这个例子中,结果是Shape3D object拥有多个父亲。

树和DAG结构的讨论是符合一般准则的。

然而由于子-父之间的关系,JA V A3D运行时系统会报错。

树结构限制了每一个Shape3D object只限于一个父亲。

图1.3中,‘多父类’的错误会在程序运时时被报告出来。

图1.4中,每一个Shape3D object都只有一个父亲,为这场景图显示了一种修改过的结构。

一个定义了不合法的场景图的java3d程序虽然能编译,但不能被渲染。

当一个定义了不合法的场景图的JA V A3D程序运行时,JA V A3D系统就会检测到这个错误。

当错误被检测到,JA V A3D 系统就会报告出这个异常。

这个程序仍然会运行,结果必然是需要被停止的,然而,没有图画被渲染。

每一个场景图都只有一个VirtualUniverse,这个VirtualUniverse对象拥有多个Locale objects.一个Locale objects在虚拟宇宙在提供了一个引用结点。

我们可以把一个Locale object看作用来确定visual objects在虚拟宇宙中位置的一个地标。

从技术上来说,一个JA V A3D程序拥有多个VirtualUniverse object是可能的,这样就定义了多个虚拟宇宙。

但是在多个虚拟宇宙之间没有内在的方法可以沟通。

进一步地说,一个场景图对象不可能在多个虚拟宇宙中同时存在。

我们强烈建议在一个JA V A3D程序中只定义一个VirtualUniverse的实例。

一个VirtualUniverse对象可以引用多个Locale对象。

大多数JA V A3D程序只有一个Locale 对象。

每一个Locale对象可以作为场景图中多个子图的根结点。

参考图1.2表示的场景图,注意,一个Locale对象产生了两个子图分支。

一个BranchGroup对象是一个子图或分支图的根结点。

有两种不同种类的场景子图:view branch graph 和the content branch graph.内容子图载明了虚拟宇宙中内容:几何体,外观,行为,位置,声音和光线。

观察子图指明了观察的参数例如观察的位置和方向。

两者一起定义了很多渲染器需要去渲染的工作.1.3.1高级JA V A3D API类层次图1.5显示了JA V A3D API前三层的类结构。

VirtualUniverse, Locale, Group和Leaf类出现在这个部分中。

除了VirtualUniverse和Locale对象,一个场景图的其它部分是由SceneGraphObject组成的。

SceneGraphObject差不多是每一个JA V A3D的核心类和实用类的父类。

SceneGraphObject有两个子类:Node和NodeComponent.Node子类提供了场景图的大部分对象。

一个Node对象是一个Group node对象或者是一个Leaf node对象。

Group和Leaf是若干子类的父类。

下面简要看一下Node类和它的两个子类,NodeComponent类,在介绍了这些背景知识之后,然后我们就会解析一下JA V A3D程序的构造Node类Node类是Group和Leaf类的抽象父类。

Node类为它的子类提供了一些重要的通用方法。

在我们讲述了更多的背景知识之后我们就会介绍这些方法的具体用法。

Node类的子类构成了场景图。

Group类Group类是在虚拟宇宙中定义视觉对象的位置和方向的父类。

BranchGroup和TransformGroup是Group类的两个子类。

在场景图的图形表示中。

Group类所代表的符号(圆圈)通常都是用BG来代表BranchGroups,TG代表TransformGroups,例如图1.2Leaf类Leaf类是在虚拟宇宙中定义视觉对象的形状,声音和行为的父类。

其中它的一些子类是Shape3D,Light,Behavior和Sound,这些对象没有孩子,但可以引用NodeComponentsNodeComponent类NodeComponent类是用来定义Shape3D (Leaf)的几何体,外观,贴图和物质属性的父类。

NodeComponents并不是场景图的一部分,但会被场景图引用。

一个NodeComponent可以被多个Shape3D引用。

1.4编写JA V A3D程序的步骤SceneGraphObject类的子类是构建场景图的基础材料。

开发JA V A3D程序的基础轮廓包含七步,这些步骤可以把许多JA V A3D程序聚合起来1.创建一个Canvas3D对象2.创建一个VirtualUniverse对象3.创建一个Locale对象,把它附加于VirtualUniverse对象4.构造一个观察分支图a.创建一个View对象b.创建一个ViewPlatform对象c.创建一个PhysicalBody对象d.创建一个PhysicalEnvironment对象e.把ViewPlatform,PhysicalBody,PhysicalEnvironment,Canvas3D附加于View对象5.构造一个内容分支图graph(s)6.编译graph(s)7.把子图插入到Locale中上述方法忽略了一些细节,但是详细说明了JA V A3D编程的基本思想:创建场景图的每一个分支图是编程的大部分工作,除了详述这些方法,下一节我们将介绍一种用更少的编程的简单方法去构建一个非常类似的场景图1.4.1编写JA V A3D程序的一种简单方法我们会用基本的方法构建相同结构的观察分支图来编写JA V A3D程序。

SimpleUniverse实用类包含了观察分支图结构的一致性,SimpleUniverse实例把基本方法中的2,3和4步骤都包含了。

在JA V A3D编程中用SimpleUniverse类来创建观察分支图可以有效地减少时间和工作量,于是程序员可以有更多的时间来关注内容分支图的开发,这就是JA V A3D编程所关注的。

SimpleUniverse对于JA V A3D编程来说是一个好的起点,因为它允许程序员忽略观察分支图。

然而,利用SimpleUniverse却不允许在虚拟宇宙中存在多个观察点。

在这教程中所有的编程实例都用到SimpleUniverse类.如果程序员需要了解View, ViewPlatform, PhysicalBody和PhysicalEnvironment类的更多的信息请参考其它文档。

SimpleUniverse类SimpleUniverse对象创建了一个包含VirtualUniverse,Locale对象,和一个完整的观察分支图的场景图。

相关文档
最新文档