JAVA3D-1

JAVA3D 的编程思想

1. 场景结构图:

clip_image002

· 最顶层是VirtualUniverse,是场景图的基础,每一个场景只能有一个.(有向无环图)

· Locale,每个程序可以有一个或多个,但同时只能有一个处于显示状态

· BranchGroup对象是一个子场景图的根节点,有两类不同的子场景,视野子场景(观察者)和内容子场景

· 每个locale下面可以有多个branchgroup节点,在它下面建立一个基准坐标系TransformGroup,就可以相对这个坐标系摆放所需要的形体,基准坐标系中还可以放入子坐标系

· Appearance/geometry(几何信息)

· ViewPlanteForm,观察点位置

可以看出一个JAVA3D场景是一个具有父子关系的树,从树根到每一个叶结点只有一条路径,从而每一个可视对象的可视属性只取决于它的场景图路径

2. JAVA3D的对象表示方法

clip_image004

如:

clip_image006

一个定义了不合理的场景图是可以编译的,但是不能被渲染

 

3. JAVA3D程序编写的一般步骤

  • 创建一个Canvas3D对象
  • 创建一个VitaulUniverse对象
  • 创建一个Locale对象,并且将它与VitaulUniverse对象关联起来
  • 构造子视野
  • 创建一个View对象
  • 创建一个ViewPlatForm对象
  • 创建一个PhsicalBody对象
  • 创建一个PhsicalEnvironment对象
  • ViewplatFrom/ViewPlatForm/PhsicalBody/PhsicalEnvironmentCanvas3D对象关联到View对象上
  • 构建内容子图
  • 编译子图
  • 将子图插入到Locale
  • 斜体部分的代码由于大部分程序都一样,可以用一个SimpleUniverse对象来代替(但也意味着放弃更多的视野子图),下图虚线框表示一个SiampleUniverse类所实现的功能

clip_image008

     /* 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个浮点数表示一个矢量

 

附:相关类图

clip_image010

posted @ 2009-10-15 01:49  refeiner  阅读(412)  评论(0编辑  收藏  举报