JAVA3D 的编程思想
1. 场景结构图:
· 最顶层是VirtualUniverse,是场景图的基础,每一个场景只能有一个.(有向无环图)
· Locale,每个程序可以有一个或多个,但同时只能有一个处于显示状态
· BranchGroup对象是一个子场景图的根节点,有两类不同的子场景,视野子场景(观察者)和内容子场景
· 每个locale下面可以有多个branchgroup节点,在它下面建立一个基准坐标系TransformGroup,就可以相对这个坐标系摆放所需要的形体,基准坐标系中还可以放入子坐标系
· Appearance/geometry(几何信息)
· ViewPlanteForm,观察点位置
可以看出一个JAVA3D场景是一个具有父子关系的树,从树根到每一个叶结点只有一条路径,从而每一个可视对象的可视属性只取决于它的场景图路径
2. JAVA3D的对象表示方法
如:
一个定义了不合理的场景图是可以编译的,但是不能被渲染
3. JAVA3D程序编写的一般步骤
- 创建一个Canvas3D对象
- 创建一个VitaulUniverse对象
- 创建一个Locale对象,并且将它与VitaulUniverse对象关联起来
- 构造子视野
- 创建一个View对象
- 创建一个ViewPlatForm对象
- 创建一个PhsicalBody对象
- 创建一个PhsicalEnvironment对象
- 将ViewplatFrom/ViewPlatForm/PhsicalBody/PhsicalEnvironment和Canvas3D对象关联到View对象上
- 构建内容子图
- 编译子图
- 将子图插入到Locale
- 斜体部分的代码由于大部分程序都一样,可以用一个SimpleUniverse对象来代替(但也意味着放弃更多的视野子图),下图虚线框表示一个SiampleUniverse类所实现的功能
/* SimpleUniverse,viewplatform等类,参见JAVA3D API
4. 激活与编译
激活:将一个内容子图放到Locale后,这个子图就处于激活状态,结果是子图中的每一个对象都会被激活,在对象被激活之前,如果对象对应的能力没有被指定的话,激活状态对象的对应参数是不能更改的
编译:BranchGroup类中定义,最好将要放入Locale对象中的BG先进行编译
5. 内容子图
典型的JAVA3D程序开始于一个继承自Applet的类
典型的代码:
setLayout(new BorderLayout());
GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();
// 设置一个BorderLayout
Canvas3D c=new Canvas3D(config);
// 设置一个BorderLayout
add("Center",c);
// 将图形环境放入BorderLayout的中心位置
BranchGroup scene=createSceneGraph(); -- 它负责创建内容子图
// 生成一个场景图分支,在其中定义分支的形体、材质、灯光等信息
SimpleUniverse u=new SimpleUniverse(c);
// 生成虚拟空间
u.getViewingPlatform().setNominalViewingTransform();
// 设置观察者的位置为缺省位置
u.addBranchGraph(scene);
// 把场景放入虚拟空间中
6. 基本类
Canvas3D,继承自AWT中的Canvas类,此类必须在场景图中的视野子图中被渲染
Transform3D,表示3D几何体的变换,该对象通常只用于创建TransferGroup对象(通常用一个4*4的双精度浮点矩阵来表示一个变换)
TransformGroup,它的实例用于创建场景图
Vector3f,通常用3个浮点数表示一个矢量
附:相关类图