Java3D总结

  • 格式:doc
  • 大小:179.00 KB
  • 文档页数:11

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的com.sun.j3d.utils包中提供一些基本形体,如长方体,圆柱体,圆锥体等。

Java3d包:Com.sun.j3d.utils包:包括一些sun公司提供的一些3d程序中经常使用的api。

Javax.media.j3d包:提供了java3d的基本api。

Javax.vecmatch包:提供了与矢量运算相关的一些api。

Java3d场景的组建一个java3d的场景图是由一组具有父子关系的节点对象形成的树状结构。

在一个树状结构中,第一个节点是根节点。

(通过从根节点到其他节点的弧可以访问其他节点)这些弧是不循环的。

一个场景图是由以方位对象的跟节点的若干棵树组成的。

而节点组件和引用弧并不是场景图树的组成部分。

场景图路径:从场景图的根节点到指定的页节点之间的路径是这个页节点的场景路径。

Java3d场景图中的每个场景图路径都是可以完全指明其页节点的状态信息。

状态信息包括可视对象的方位,方向,和尺寸。

Java3d的渲染系统是按照他的场景顺序来渲染的。

实例分析:当两个TransformGroup对象共享同一个shape3d叶节点对象作为他们各自的子节点时,是不允许的(不能将一个shape3d安放在不同的地方)。

记住:一个页节点对象只能拥有一个父节点。

换句话说,从Locale对象到页节点只有一条路径。

一个定义不合理的场景图的java3d程序是可以编译通过的,但是不能被渲染。

如果是这样的话当屏幕一片漆黑的时候,就是需要考虑是否场景图逻辑错误存在于设计的场景中了。

Java3d的几个基本类1.Node类:是Group和leaf类的抽象父类,node类定义了子类中一些重要的公用的方法。

2.Group类:Group类是用来指明可视对象在虚拟世界中方位的父类。

他的两个子类是BranchGroup和TransformGroup。

BranchGroup需要设置(一些情况):能力位( For BranchGroup nodes, specifies that this BranchGroup allows detaching from its parent 。

)3.Leaf类:leaf类是用来指明虚拟世界中的可视对象的声音,形状,和行为的父类。

他的一些子类包括shape3d,light,behavior和sound。

这些对象不能有子节点但是可以引用NodeComponent。

4.NodeCompenent类:NodeComponent类是用来描述shape3d节点的几何特性,外观,纹理,材质的父类。

NodeComponent不是场景图的组成部分,当时在场景中可以引用他们。

一个NodeComponent可以被多个shape3d对象同时引用。

编写java3d的步骤:(1)创建一个Canvas3d对象。

(2)创建一个VirtualUniverse对象。

(3)创建一个Locale对象,将他与VirtualUnivers对象联系起来。

(4)构造视野子图。

a.创建一个View。

b.创建一个ViewPlatform。

c.创建一个PhysicalBody对象。

d.创建一个PhysicalEnvironment对象。

e.将ViewPaltform,PhysicalBody,PhysicalEnvironment和Canvas3D对象联系到View对象上。

(5)构造内容子图。

(6)编译子图。

(7)将子图插到Locale。

默认的,图像板居中放置于SimpleUniverse的原点。

默认的方向是与z轴方向垂直,从这个位置,x轴水平的穿过图像板,右侧是正轴,y轴垂直的穿过图像板,上面是正半轴。

结果点(0,0,0)位于图像板的正中间。

激活和编译将一个子图插入到Locale后,这个子图就是处于激活状态,结果这个子图中的每个对象都被激活。

在对象被激活之前,如果对象对应的能力没有被指定的话,那么处于激活状态对象的对应参数是不能够修改的。

BranchGroup对象可以是编译的。

V oid compile():编译与该对象有关的BranchGroup,然后创建一个编译过的场景。

注意:在基本的编程步骤中没有“开始渲染”这一步。

Java3d渲染工作是位于一个无限的循环中,只要一个虚拟世界中的View实例变为激活的就进入该循环。

能力和性能性能:就是对系统的一种优化方式,当前主要用的是BranchGroup下的compile方法,他主要的功能是一条路径上有两个TransformGroup对象时,合并为一个,另一个可就是合并具有固定物理关系的Shape3d对象,但是当能力没有被设置的时候,这些优化是可能的,其他的优化也是可能的。

这种转化最重要的效果是提高了渲染的性能。

能力:也就是我们说的能力位置,它的设置目的是当我们要改变某些shape3d在编译后改变其状态或位置及加动画等变动时,必须要在程序编译后者激活之前设置能力。

不然的话就有异常报出。

点,线,面的生成Java3D中线的生成是由LineArray等对象生成的,而LineAttributes的功能则类似于PointAttributes对象,可以设置直线的宽度,反走样效果和样式.//创建直线数组对象LineArray line = new LineArray(6, LineArray.COORDINATES| LineArray.COLOR_3);line.setCoordinates(0, vert);//设置直线的坐标数组line.setColors(0, color);//设置直线数组的颜色坐标LineAttributes la = new LineAttributes();//创建直线属性对象la.setLineWidth(1.0f);//设置直线的宽度la.setLineAntialiasingEnable(true);//设置直线的渲染效果Appearance ap = new Appearance();//创建对象的外观属性ap.setLineAttributes(la);//设置LineAttributes属性this.setGeometry(line);//设置几何体形状this.setAppearance(ap);//设置外观属性2D和3D 文字的生成有两种方法可以将文字加到JA V A3D 场景中。

一种是Text2d类,一种是Text3d类。

Text2d 对象是具有文字纹理的多边形(这个多变形是透明的只要纹理部分是可见得)。

Text3d对象是文字形状的3d几何体。

注意:Text3d是Geometry的子类,因此Text3d对象是一个NodeComponent,他可以被多个shape3d对象引用。

Appearance 对象:主要功能是表示一些对象的外观属性,是对对象外观的一种抽象,它的成员变量保存了一些属性的数据,而不说具体的渲染方法(所以可以重复的给不同的shape3d运用),具体的渲染方法留给指定该外观属性的几何体,并且他在java3d中只保留一份外观数据,节省存贮空间。

这也是将数据和操作抽象分离的作法,也是面向对象的设计方法。

(这也是优化程序减少的内存的方法)。

Shape3d 对象可能会同时引用一个Geometry对象和一个Appearance对象。

Appearance常用方法:setPointAttributes,setLineAttribute,setPolygonAttributes,setMaterial,setColoringAttributes :设置外观属性,当Geometry设置了颜色,此方法无作用,setRenderingAttributes:设置外观渲染属性。

setTransparencyAttributes:设置外观透明度属性(当设置一个shape3d为透明时能用到,如在广告牌-树)。

Shape3d:维持一个Geometry对象的列表,将这些几何体与该shape3d对象关联。

有两种方式可一关联几何体与shape3d,一种是继承shape3d,一种是setGeometry()方法。

Bounds:允许程序员制定一个空间范围。

它的子类有:BoundingShpere,BoundingBox,BoundingPolytope。

BranchGroup对象和OrderedGroup对象BranchGroup对象:通常是整个场景的跟节点,灯光背景等效果对象加在这一对象上面。

OrderedGroup对象:在场景渲染的时候,它是按照下标顺序渲染的,在需要特殊效果时候才用到。

DecalGroup对象:透现一个面中的多个面一般用OrderedGroup的子类DecalGroup --最典型的应用就是:在文字付着几何体表面的时候,如果不使用DecalGroup对象,程序就无法显示正确的结果。