Java 3D 学习笔记

1.java3d开发环境搭建

  • jdk(java development kit)安装
  • java3d安装
  • IDE安装(eclipse,idea,netbeans选择一种即可)

2.java3d开发引擎

  • JME
  • Ardor3D
  • Xith3D

3.java3d原理

JAVA 3D从高层次为开发者提供对三维实体的创建、操纵和着色,使开发工作变得极为简单。同时,JAVA 3D的低级API是依赖于现有的三维图形系统的,如Direct 3D、OpenGL、QuickDraw 3D和XGL等,它可以帮助我们:
A. 生成简单或复杂的形体(也可以直接调用现有的三维形体)
B. 使形体具有颜色、透明效果、贴图。
C. 可以在三维环境中生成灯光、移动灯光。
D. 可以具有行为(Behavior)的处理判断能力(键盘、鼠标、定时等)
E. 可以生成雾、背景、声音等。
F. 可以使形体变形、移动、生成三维动画。
G. 可以编写非常复杂的应用程序,用于各种领域如VR
JAVA 3D的这种体系结构既可以使其开发的程序“到处运行”,又使其能充分利用系统的三维特性。就因为JAVA 3D拥有如此的强大的三维能力,使得它在网络世界,特别是在游戏中能大展姿彩。

4.常用函数介绍

BranchGroup 类 
这种类型的对象是用于构建建场景图的, BranchGroup的实例是子图的根结点, BranchGroup对象也是唯一能成为Locale对象的孩子对象的对象。BranchGroup对象可以有多个孩子, BranchGroup对象的孩子对象可以是Group和Leaf对象。 

BranchGroup 默认构造函数 

BranchGroup() 

BranchGroup的实例,作为场景图分支的根结点,BranchGroup 对象也是能唯一插入到Locale对象中的对象。 


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对象的图形变换的。 

Transform3D() 

构造一个Transform3D 对象,默认使用单位矩阵 (不顾虑在变换)。 

一个Transform3D对象能表示平移,旋转,缩放乃至这些变换的组合。当指定一个旋转变换时,角度用弧度来表示。一个全 

旋转(圆)的弧度是2 PI。设置角度的一个方法是利用常量Math.PI,另外一种算途径是直接设置,这里说一下常用角度的 

弧度:45度是0.785, 90度是1.57, 而180 度是3.14(约为PI)。 

Transform3D 类的方法 (列出部分) 

Transform3D对象用于表示几何形变,比如旋转,平移和缩放。 Transform3D是没在任何场景图中直接使用到的少数几个类之一。Transform3D对象所定义的变换是用于创建场景图中的 TransformGroup 对象的。 

void rotX(double angle) 

设置图形X轴方向沿逆时针对象按指定的角度旋转。角度值用弧度指定。 

void rotY(double angle) 

设置图形Y轴方向沿逆时针对象按指定的角度旋转。角度值用弧度指定。 

void rotZ(double angle) 

设置图形Z轴方向沿逆时针对象按指定的角度旋转。角度值用弧度指定。 

void set(Vector3f translate) 

利用传入的Vector3f型的参数设置图形的平移值,如果这个传入的形变是单位矩阵,则在其它时候设置真正的形变值。 


TransformGroup 类 

作为Group类的子类,TransformGroup类的实例用于创建场景图并且都其子结点的集合。TransformGroup对象存储了几何形变比如平移和旋转。一般利用不在场景图中的Transform3D对象来构造某一形变。TransformGroup对象保存了场景图中的形变信息。 

ransformGroup 构造函数 

TransformGroup() 

利用单位矩阵来构造并且初始化一个TransformGroup对象。(不发生形变) 

TransformGroup(Transform3D t1) 

通过传入Transform3D对象参数来构造并且初始化一个TransformGroup 对象。 

参数: 

t1 - transform3D对象 







Transform3D对象中所包含的形变信息在TransformGroup对象创建时或者是调用了setTransform()方法变复制到 TransformGroup中。 

TransformGroup setTransform() 方法 

void setTransform(Transform3D t1) 

利用传入的形变参数设置TransformGroup对象的形变值。 

参数: 

t1 - 要复制的transform3D对象。 


Vector3f 类 

Vector3f 是包javax.vecmath中的数学类,用于用浮点数来设定一个矢量。Vector对象常常用于设置图形开变。 

Vector3f对象也不直接在场景图中用到。常用于指定形变,表现,法向量以及一些其它的应用。 

Vector3f 构造函数 

一个三个元素的矢量。其三个元素用单精度浮点数表示X,Y,Z坐标。 

Vector3f() 

用(0,0,0)构造并初始化一个Vector3f。 

Vector3f(float x, float y, float z) 

指定x,y,z轴坐标来构造并初始经一个Vector3f。 



ColorCube 

ColorCube 是包com.sun.j3d.utils.geometry中的工具类。定义了一个立方体图形及其各面的不同的颜色,并使位置处 

于初始位置的中间。默认的 ColorCube对象是一个长宽高均为2米的立方体。如果一个处于原始位置未经旋转的立方体(如 HelloJava3Da示例中的),在名义上的视图位置中,红色面是可见的,其它面的颜色分别是:蓝色, 洋红,黄色,绿色和 青色。 

ColorCube 构造函数 

包: com.sun.j3d.utils.geometry 

一个ColorCube 是一个简单的各面均有不同颜色的可视的立方体。 

ColorCube 扩展了Shape3D 类;因此,它是叶子结点。 ColorCube可以很容易地放置于虚拟世界中。 

ColorCube() 

以默认的大小构造一个有色立方体。默认地,每一个角到相应坐标的中心都是1米,因而,此立方体处于视图正中心,长宽高 

都是2米。 

Node 类 

Node是Group和Leaf类的一个抽象超类. Node 为其子类定义了一些公共的重要的方法。某些方法的信息会在更多的背景知识介绍了之後提到。Node 的子类构成了子图。 



Group 类 

Group 类是用于在虚拟世界中指定可视对象位置和方向的类的超类。Group类的两个下层类是 BranchGroup是 TransformGroup. 在场景图的图形表现中,Group标记 (用圆表示)。而其中BranchGroups注为GB, TransformGroups 注为TG,等等。具体例子请见图1-2。 


Leaf 类 

Leaf是用于指定虚拟世界中可视对象的形状,声音和,动作的类的超类。Leaf的一些子类如Shape3D, Light, Behavior, 和 Sound. 这些对象不能有自己的孩子,并且可能引用NodeComponents对象。 

NodeComponent 类 


NodeComponent 类

是用于指定Shape3D (Leaf)结点对象的图形,表面,纹理和材质属性的类的超类。NodeComponents 不是场景图的组成部分,但是为其所引用。一个NodeComponent 对象可能为多个Shape3D对象所引用(译者注:就是比如,同一个材质对象可以赋予多个shape3D对象


Group对象

     方法: addchild, insertchild,removechild,setchild

     用来对形体的分组,是所有Group类的父类,Group nodes have exactly one parent and an arbitrary number of children that are  rendered    in an unspecified order (or in parallel). Null children are allowed; no operation is performed on a null child node.

      子类: BranchGroup, OrderedGroup, Primitive, SharedGroup, Switch, TransformGroup, ViewSpecificGroup


BranchGroup

通常做为整个场景的根节点,灯光,背景等效果对象都加在这一对象上面

OrderedGroup

与BG有相同的效果,只不过渲染的时候是按下标的顺序来渲染

DecalGroup

OG的一个子类,只有这个类可以正确的显示位于同一平面上的多个重叠的平面

Switch

可以灵活控制一组对象中的单个或者几个,切换的作用

ShareGroup

可以以一个图像为模子进行同一对象的复制

2.几何变换

   TG:定义局部坐标系,通过对它的设定可以实现形体的旋转与放缩怎么变换


TransformGroup(Transform3D t)

标志: ALLOW_TRANSFORM_READ,ALLOW_TRANSOFRM_WRITE

如果想让物体移动,一定要指定这两个标志.


Transform3D

通常表示TG对象相对于父节点(如BG)的位置/角度/尺度等空间的变换


TransformGroup对象与Transform3D对象的应用

程序中每次指定TG对象的Transform3D属性都需要生成新的T3D对象,这是因为不同的TG对象都保留着自己的T3D对象的实例,且仅有一个,因此不同的TG对象如果提供的变换是不一样的,那么必须使用不同的T3D对象



TransformGroup特点:

1.在三维空间中放置任何形体,灯光,声音都要要到该对象。

2.该对象用来定义一个通过设置,可以移动、旋转和放大缩小的局部坐标系。

3.该对象有两个flags,其中ALLOW_TRANSFORM_WRITE用来将最新的数据(即坐标变化后的数据写入到数据结构中),允许程序在运行的时候修改该节点上的场景。ALLOW_TRANSFORM_READ用来读取位置变化前的数据,从而进行判断和处理。允许程序在运行的时候读取该节点上的场景。

4.通过设置ALLOW_TRANSFORM_WRITE来使坐标系运动(此时在不要读取值时使用,如读取移动的距离,选旋转的角度,缩放的比例等值。若要读取这些值,则要再使用ALLOW_TRANSFORM_READ)

5.要在程序中通过鼠标,移动、旋转、比例放大所指定的局部坐标系,则需要同时设置ALLOW_TRANSFORM_WRITE和ALLOW_TRANSFORM_READ。

6.Java虚拟机会为这两个flags创建单独的线程(或者进程)来负责接收场景的反馈,在控制场景,避免了用户不必要的开销。

Transform3D的特点

1.表示所指定的坐标的坐标变换,如旋转、放大缩小、平移等

2.Quat4f(x,y,z,w)的参数介绍

 x:x坐标    y:y坐标    z:z坐标   w:物体旋转的角度   如:

  Quat4f(0.0f,1.0f,0.0f,1.57f) 表示物体绕Y轴旋转90度,当Y轴的只越大则旋转的幅度越大。

  当x,y,z的值不为0时,其值的大小即表示转动幅度的大小,值越大,表示向该方向转动的幅度也越大。

3.Transform3D有四个方法rotx(),roty(), rotz(),setTranslation().当这四个方法一起使用的时候,只有最后一个有作用。为了能够让rotx,roty, rotz都显示出来,则可以使用setRotation(new Quat4())来代替,此时不论setTranslation()在setRotation(new Quat4())前还是后,都可以显示出效果。

你可能感兴趣的:(三维显示理论及java3d实践)