java 3D 第二章 java 3D基本概念

java 3D 第二章 java 3D基本概念

  • java 3D基本概念
    • java 3D的包及其功能
    • java 3D 高分辨率大尺度坐标
    • Java 3D场景图(Scene Graph)
      • VirtualUniverse虚拟空间的结构图
    • 虚拟空间(VirtualUniverse)
    • 场所(Locale节点)
    • 叶子节点
    • Java 3D物理世界与虚拟世界之间的关系
      • Java 3D的三种可视化模式
        • 立即显示模式
        • 保留显示模式
        • 编译保留模式
    • SimpleUniverse类
    • Java 3D的三维空间范围
    • 激活与预编译概念
      • 能力位
      • TransformGroup对象的能力位的设置
    • Java 3D的View类观察模型
      • 概念与定义
      • View类对象
      • 行为与插值器(Behaviors and Interpolators)
        • 行为Behaviors
        • 同步显示执行
        • Behavior与唤醒(Wakeup.. )
        • Behavior与组合
        • 内插器行为(Interpolator Behaviors)

java 3D基本概念

java 3D的包及其功能

  • (1)com.sun.j3d.audioengines:对创建Java 3D音频设备提供抽象的类。
  • (2)com.sun.j3d.audioengines.javasound:对一个Java 3D音频设备提供了一种基于Java声音的实现。
  • (3)com.sun.j3d.loaders:对编写各种Java 3D loader加载程序提供了接口和抽象类。
  • (4)com.sun.j3d.loaders.lw3d:对Lightwave 3D场景文件提供了一个Java 3D loader加载程序。
  • (5)com.sun.j3d.loaders.objectfile:对Wavefront.obj文件提供了一个Java 3D loader加载程序。
  • (6)com.sun.j3d.utils.applet:对将一个applet程序作为独立的应用运行提供了实用程序类。
  • (7)com.sun.j3d.utils.audio:提供了音频实用程序类。
  • (8)com.sun.j3d.utils.behaviors.interpolators:提供了基于三次插值曲线(spline)的插值行为。
  • (9)com.sun.j3d.utils.behaviors.keyboard:提供键盘导航实用程序类。
  • (10)com.sun.j3d.utils.behaviors.mouse:提供了鼠标导航实用程序类。
  • (11)com.sun.j3d.utils.behaviors.sensor:提供六自由度传感器行为类。
  • (12)com.sun.j3d.utils.behaviors.vp:提供了观察平台(ViewPlatform)导航实用程序类。
  • (13)com.sun.j3d.utils.compression:提供了几何压缩实用程序类。
  • (14)com.sun.j3d.utils.geometry:提供了几何构建、三角化与优化实用程序类。
  • (15)com.sun.j3d.utils.image:提供了纹理图像(Texture image)实用程序类。
  • (16)com.sun.j3d.utils.pickfast:对新的核心拾取方法提供了拾取实用程序类。
  • (17)com.sun.j3d.utils.pickfast.behaviors:对新的核心拾取方法提供了拾取行为
  • (18) com.sun.j3d.utils.picking:这是一个过时的包,为老的拾取方法提供拾取实用程序类。
  • (19)com.sun.j3d.utils.picking.behaviors:这是一个过时的包,为老的拾取方法提供拾取行为。
  • (20)com.sun.j3d.utils.scenegraph.io:这个包针对Java3D的场景图输入输出功能(Java3D SceneGraph IO)提供了一种能力控制。
  • (21)com.sun.j3d.utils.scenegraph.transparency:该包提供了透明分类实用程序。
  • (22)com.sun.j3d.utils.shader:提供阴影生成实用程序类。
  • (23)com.sun.j3d.utils.timer:提供一个高精度、并依赖于操作系统的间隔定时器(Interval timer)。
  • (24)com.sun.j3d.utils.universe:对设置Java 3D空间(Universe)与观察设置提供了实用程序类。
  • (25)javax.media.j3d:提供了Java 3D API核心集类。
  • (26)javax.vecmath:提供了三维向量数学类。

java 3D 高分辨率大尺度坐标

定义与运用:

  • High-Resolution Coordinates可译为高分辨率坐标系,在本书中称为高分辨率大尺度坐标系。这种坐标系可为极微细的原子空间建立坐标系,也可为宇宙空间建立坐标系。
  • 目前,最常用的浮点数的表示方式有单精度浮点数、双精度浮点数与固定点浮点数。这些表示形式在某些情况下或者在一定的精度范围内能够精确地表示坐标值但是当要表示大到象一个宇宙尺寸(如二百亿光年)或者小到像普兰克长度(普兰克长度,Planck length :2(-115.57)米)这样的尺寸时,这些数的表示方式就不适合了。为此,Java 3D提出了高分辨率大尺度坐标表示
  • Java 3D高分辨率大尺度坐标采用256个二进制位的定点数来表示一个数。Java 3D高分辨率大尺度坐标系用256位带正负符号的、二进制补码、固定点数来表示。固定点在128位。固定点之右有128个二进制位,固定点之左有128二进制位。在这种情况下,值20就精确地表示1。这种坐标系足以描述大到几千亿光年的距离,小到可以描述比质子还小的物体(甚至比普兰克长度低)。
  • 256位固定点数包含了单精度浮点数、双精度浮点数与其它固定点浮点数。
  • 采用高分辨率大尺度数所能表示数的范围如下表所示 :
n值(2n 米中n) 所表示的长度单位
87.29 二百亿光年的宇宙
69.68 十万光年银河系
53.07 一光年
43.43 太阳系直径
23.60 地球直径
10.65 英里
9.97 一公里,一千米
0.00 一米
-19.93 一微米
-33.22 (Angstrom,一亿分之一厘米,用作测量波长的单位)
-115.57 **普兰克长度(**Planck length
  • Java 3D高分辨率大尺度坐标系就是用高分辨率或大尺度数分别表示一个点的x、y、z坐标值的坐标系,该坐标系是一个右手直角坐标系。
  • 要用高分辨率大尺度数在高分辨率大尺度坐标系中表示三维空间一个点的x、y、z坐标值,就需要三个高分辨率或大尺度数
  • Java 3D高分辨率大尺度坐标系常常只用来将更多的传统浮点坐标系嵌入到一个更大尺度坐标基体中。这样,就可创建一个具有任意可想象尺寸或任意刻度的可见无缝的虚拟空间,而不用担心数字精度问题。

原理:

  • 虽然Java 3D保持其高分辨率大尺度坐标系的内部表示形式对用户不透明,
  • 用户可通过应用8元素的整形数组来确定这样的坐标系。每一个整形数组元素对应32个二进制位,则8个整形数组元素就对应8*32=256个二进制位。
  • Java 3D把序号0处的整数作为包含32最有意义的高分辨率坐标位,把序号7处的整数作为包含32最没意义的高分辨率坐标位。(序号7是最高位的整形数组,高精度是数值的变化越小越好)
  • 这种二进制固定点位于128位处,或者位于序号3和序号4所表示的整数之间。20的大尺度坐标值是1米。
  • 用8元素的整形数组表示的高分辨率数如下图所示。

每个整形数组元素都是从20-231,而最终的8元素的整形数组由计算机计算。例如:{0,0,0,0,1,1,0,0}此时会由计算机按128-127位对其计算

Java 3D场景图(Scene Graph)

  • Java 3D的基于场景图的编程模型对表示与可视化一个场景提供了一种简单而灵活的管理机制。这种场景图包含了一种对整个场景或者一种虚拟空间的完整描述。其中包括:相关几何数据,相关属性信息,以及给定视点后的相关视点观察信息等。
  • java 3D定义了两种场景图超级结构对象:VirtualUniverse,Locale。这两个超级结构对象用来包装构成一个场景图的各子图。
  • 一个场景图由一个VirtualUniverse对象、一个Locale对象、一个BranchGroup节点子图集合组成。每一个子图是以一个BranchGroup节点为根节点,并且添加到一个超级结构上。
  • 一个场景图本身从BranchGroup节点开始。一个BranchGroup节点作为一个子图(Sub Graph)的根,称为这个场景图的一个分支图(Branch Graph)。只有BranchGroup节点对象才能够加入到Locale对象上。

VirtualUniverse虚拟空间的结构图

java 3D 第二章 java 3D基本概念_第1张图片

实线箭头代表父节点到子节点的链接,虚线箭头代表引用

场景图观察对象

  • Java 3D定义了5个场景图观察对象,用来定义观察参数,并提供与物理世界的联系。这些对象包括:Canvas3D(画布),Screen3D(显示屏),View(观察),PhysicalBody(物理人体),PhysicalEnvironment(物理环境)。

  • 一个ViewPlatform(观察平台)叶子节点在虚拟世界中定义了一个坐标系和一个具有相关原点或参考点的参考框架。ViewPlatform作为观察对象的依附点,并且作为一个可视化器观察的基点。 (ViewPlatform是上面五个观察对象的子节点,上图有!)

ViewPlatform(观察平台)

  • 直接处在ViewPlatform节点之上的TransformGroup节点决定在虚拟世界中的一个ViewPlatform节点所处的位置与指向。通过修改在ViewPlatform节点之上、并与一个TransformGroup节点相关的Transform3D对象,一个Java 3D应用程序或一个Behavior行为对象可将该ViewPlatform在虚拟世界中任意移动。一个简单应用程序可能在ViewPlatform之上定义了一个TransformGroup节点。(ViewPlatform的子节点是TransformGroup)
  • 一个VirtualUniverse虚拟世界可能有多个不同的ViewPlatform,但是一个View观察对象只能将它自己添加到一个单一的ViewPlatform上。因此,可视化到一个Canvas3D(画布)上的图象是从一个单一的ViewPlatform的观察点所产生的。
  • ViewPlatform是一个叶子节点,用来确定在一个场景图中的观察基点。ViewPlatform的父节点在一个虚拟世界中确定一个视点的位置、观察方向、比例

Canvas3D(画布)

  • Canvas3D(画布)对象是AWT(Abstract Windowing Toolkit)的Canvas对象的3D版。它提供了一个窗口用来显示Java 3D的图象。Canvas3D对象包含一个针对Screen3D对象(显示屏对象)的一个参照,并且包含有在Screen3D对象内定义Canvas3D对象的尺寸、形状和位置的信息。
  • Canvas3D包含所有与可视化窗口有关的参数。当一个Canvas3D对象加到一个View对象中时,Java 3D可视化程序就将可视化结果投向该Canvas3D对象上

Screen3D对象

  • Screen3D对象(Screen3D Object)包含与显示该Canvas3D对象的物理显示器有关的所有参数,如以像素为单位指定的显示宽度与高度,显示屏的物理尺寸,以及各种物理值。
  • Screen3D对象包含描述显示器物理属性的信息。
  • Java 3D将显示器的信息放在一个独立的对象中定义是为了防止与在Canvas3D对象中定义的屏幕信息重复。

View对象

  • View对象(View Object)定义可视化一个场景图所需要的信息。在虚拟空间结构图中,包含了一个为了显示一个场景图而附加到该简单场景图的观察对象(Canvas3D)。
  • View对象是Java 3D为了协调与观察有关的各个部分的一个核心对象。在Java 3D中的所有观察参数直接包含在View对象内或者View对象所指的对象内。View对象包含所有与观察有关的参数。Java 3D支持多个同一时刻处于激活状态的View

PhysicalBody对象、PhysicalEnvironment对象

  • PhysicalBody对象(PhysicalBody Object)封装了所有与物理实体相关的参数,如头的位置,左右眼睛的位置等。PhysicalBody:包含了描述用户物理身体的尺度信息。
  • PhysicalEnvironment对象(PhysicalEnvironment Object)封装了所有与物理环境有关的参数,如对于头部或者手部跟踪装置的基点的刻度信息。PhysicalEnvironment: 如果外部跟踪硬件存在,则在PhysicalEnvironment对象中主要包含了一个描述环境中六自由度跟踪硬件的尺度信息。

虚拟空间(VirtualUniverse)

  • 虚拟空间(The Virtual Universe),也可译为虚拟宇宙。Java 3D定义了一个虚拟宇宙的概念,作为一种与相关对象集有关的三维空间,也称为虚拟空间。虚拟空间在物理空间单元和内存可能很大,在大多数情况下单个的虚拟空间将能够满足一个应用程序的所有需要
  • 虚拟空间是独立的实体,其中在任何时候,没有那一种节点能够在多个虚拟空间中存在,只能在一个虚拟空间中存在。同样,在一个虚拟空间中的对象在其它虚拟空间中是不可见的,并且不能与在其它虚拟空间中的对象交互
  • 为了支持一个大型的Virtual universe虚拟空间,Java 3D引入了具有高分辨率大尺度坐标系Locale类场所节点。将高分辨率大尺度坐标系想象为一种“束缚”(tie-downs),该“束缚”把用不太精确的浮点数表示的对象的位置精确地固定住(anchor),并且这种不太精确的浮点数是在该高分辨率大尺度坐标系的影响范围之内。
  • Java 3D定义虚拟宇宙的类是VirtualUniverse类。一个VirtualUniverse定义了一种虚拟空间。
  • Java 3D允许有多个虚拟空间,最常用的是只有一个虚拟VirtualUniverse空间。VirtualUniverse虚拟空间为场景图提供了一种基础。所有的Java 3D场景图连接到一个VirtualUniverse虚拟空间上。
  • VirtualUniverse类的构造函数VirtualUniverse()创建一个新的VirtualUniverse对象,表示一个虚拟宇宙。
  • 一个VirtualUniverse类定义的对象是包含所有场景图的最高级别的容器。一个虚拟宇宙VirtualUniverse中可包含多个Locale对象,每一个Locale对象在虚拟宇宙VirtualUniverse之内具有一个用高分辨率大尺度数定义的位置。一个应用程序可能会包含多个VirtualUniverse对象,但是大多数的应用程序只需要一个VirtualUniverse对象。

场所(Locale节点)

  • 场所Locale节点是与Virtual universe虚拟空间紧密相关的一个类。在一个虚拟宇宙中并没有定义一个坐标原点及其坐标系,Java 3D通过Locale类在一个虚拟空间中定义相应的坐标系及其原点。。一个Locale类场所节点,具有其高分辨率大尺度坐标系,并作为位于一个虚拟空间之下的一种表示。所有的虚拟空间包含一到多个具有高分辨率大尺度坐标系的Locale类场所节点,所有其它对象都添加到一个Locale类场所节点中。

  • 高分辨率大尺度坐标系作为一种只针对transform类节点的上层转换。
    例如,对于一个特定的Locale类场所节点,所有加入其中的对象的坐标系都与该Locale类的高分辨率大尺度坐标系的位置相关

  • Locale对象在虚拟空间中确定一个固定的位置。该固定位置对所有位于其下的场景图节点定义了一个原点。

  • Locale对象允许一个程序员很精确地定义其Locale场所的原点,并且具有一个很大的动态范围。

  • 一个Locale对象能够精确地在已知物理空间的任何地方指定一个位置,可以达到普朗克长度的精度(约为2.6x10-35米)。通常,Java 3D程序只有一个Locale对象,该Locale对象的默认原点为(0,0,0)。

  • 具有多个Locale对象的Java 3D程序将为每一个Locale对象设置一个位置,以便这些Locale对象能为位于其下的节点提供一个合适的局部原点。

例如,对火星着陆模型,程序员可能会以在卡纳维拉尔角(Cape Canaveral,美国一火箭发射场)的一个原点创建一个Locale对象Locale1,该Locale1对象的原点是(0,0,0);然后再在火星上的着陆地点创建另一个Locale对象Locale2,该Locale2对象的原点由于距离地球很远,因此需要用高分辨率大尺度坐标相对于Locale1对象的原点(0,0,0)来创建Locale2对象的原点。然后再在相应的Locale1对象与Locale2对象的坐标系内创建各自的三维几何对象,这可应用双精度浮点数、单精度浮点数。(locale1是绝对坐标,locale2是相对坐标)

  • 一个Locale类节点在场景图中没有父节点,但是当它创建的时候却隐含地添加到一个VirtualUniverse类创建的虚拟空间上。在这个

  • 在一个VirtualUniverse虚拟空间下是一个场所对象(Locale object)。在这个locale对象中对依附它的子图定义了一种高分辨率大尺度坐标系的原点。

  • 一个Locale节点可包含多个BranchGroup节点,但却没有一个显式的子节点。

  • Locale坐标系原点的创建

    • 定义Locale场所节点的类是Locale类,其一个构造函数如下:
      Locale(VirtualUniverse universe,int[] x,int[] y,int[] z)构造函数用给定参数创建一个新的高分辨率大尺度Locale对象,该Locale对象的高分辨率大尺度坐标系的原点用三个8元素整形数组x、y、z定义 ,但是int范围有限无法表示高分辨率大尺度数。因此需要HiResCoord类。
    • HiResCoord类用三个高分辨率大尺度数定义一个Locale类对象的高分辨率坐标系的原点,该原点的位置用三个8元素整形数组x、y、z定义。该高分辨率坐标系的表示范围包含了双精度浮点数、单精度浮点数与其它固定点数。
      一个Locale类对象在由VirtualUniverse类定义的虚拟宇宙的内部定义了一个高分辨率大尺度坐标系及其高分辨率大尺度的原点(用HiResCoord类定义)。
    • 该Locale类的对象是一个以所定义的原点为参考点的容器,用来包含以BranchGroup节点为根节点的场景子图。在一个Locale节点内,所有的对象相对于该Locale的原点用标准的双精度浮点坐标定义 。
  • 默认情况下Java 3D坐标系:
    默认情况下,Java 3D坐标系采用右手坐标系统,坐标系原点在显示器的中心,x轴水平向右,y轴垂直向上,z轴指向观察者。默认情况下,坐标单位为米

叶子节点

Java 3D将节点对象分为两个子类

  • Group节点

    • 一个Group节点可组织一到多个子节点,但只能有一个父节点。SharedGroup共享节点不能有父节点。
    • 一个Group节点负责将一个场景图组织在一起。子节点可以是一个Group节点,或者是一个叶子节点(Leaf nodes)
  • Leaf节点(叶子节点)

    • Leaf节点包含几何元素、光源、声音等具体信息的定义。一个Leaf节点没有子节点,但只有一个父节点。

    • Shape3D节点、Light节点、ViewPlatform节点、Behaviors节点等都是叶子节点。

节点组件对象

  • 叶子节点对应的是数据对象(Data Objects),也称为节点组件对象(NodeComponent objects)。节点组件对象不是场景图节点,但是他们包含有叶子节点需要的数据,比如所要画的几何元素,或者是所要播放的声音。
  • 对于叶子节点来说,可定义其节点组件对象。如Shape3D叶子节点包含Geometry3D、Text3D、Material等,这些都是叶子节点的组件对象(并不是shape3D的子类)。

Java 3D物理世界与虚拟世界之间的关系

​ Java 3D的观察模型集成了头盔直接跟踪(Head-Tracked)的功能,无需附加操作,在虚拟世界中就能使用户具有身临其境的感觉。Java 3D的观察模型在没有头盔跟踪环境以及将图形可视化到一个标准显示器的情况下,具有透明地产生立体视图的附加功能。

Java 3D的三种可视化模式

​ 在可视化场景时,Java 3D支持三种不同显示模式:立即模式(Immediate Mode)、保留模式(Retained Mode)和编译保留模式(Compiled-Retained Mode)。这三种显示模式在图形处理速度与重构方面存在巨大差别

立即显示模式

立即模式分为两种:1)纯立即显示模式;2)混合立即显示模式。

立即模式可能应用或者忽略Java 3D的场景图结构。通过应用立即模式,终端用户的应用具有更大的自由度,但是这种自由度以降低运行速度为代价。在立即模式中,Java 3D没有有关图形对象或者它们的组合的高级别信息。因为它具有最少的全局知识,Java 3D只能根据程序员的应用需要仅进行局部的优化

纯立即显示模式

  • 纯立即显示模式是为那些不需要Java 3D对场景图做任何自动显示的应用程序而设计的。这种应用程序甚至不希望去建立一个场景图来表示它们的图形数据。然而,它们应用Java 3D的属性对象来设置图形状态,应用Java 3D几何对象来显示几何体。

  • Java 3D提供了实用程序功能来创建代表纯立即模式应用的大部分结构,从应用程序的角度来看并不是很显著,但是这种结构必须存在。所有的显示都完全处在用户的控制之下。在纯立即模式,用户必须停止Java 3D的可视化器。在将Canvas3D对象增加到一个激活的View观察对象之前,通过Canvas3D对象的stopRenderer()方法实现。

混合立即模式

  • 混合立即模式和保留模式或编译保留模式要求比纯立即模式更多的结构。在混合模式,Java 3D可视化器一直在连续运行,将场景图显示在Canvas布上。
保留显示模式
  • 保留模式要求一个应用程序构建一个场景图,并且确定在该场景图中哪些元素在可视化过程中会发生变化。该场景图描述在虚拟空间中的所有对象和这些对象的相互位置,并且确定了该应用程序如何动画这些对象。
  • 保留模式保留了由立即模式提供的灵活性的一大部分,并且在显示速度方面有很大的提高。在当前场景图中定义的所有对象都是可连接的与可操作的。场景图本身是完全可操作的。应用程序员可很快地构建这个场景图,创建和删除节点,并且可立即看到相应编辑的效果。保留模式也允许最大限度地提供拾取操作来选择对象。
编译保留模式
  • 预编译保留模式,像保留模式一样,要求应用程序构建一个场景图,并且确定场景图中的哪些元素在可视化过程中会发生变化。在此基础上,应用程序可以编译该场景图中的一部分或全部子图(Subgraph)。Java 3D将这些子图编译成一种内部格式。这种已编译过的部分可能与原来应用程序定义的树状结构不同,但在功能上是等价的。预编译保留模式能提供最高的执行性能。
  • 预编译保留模式允许Java 3D API执行一种任意复杂系列优化操作,其包括(但不限于):几何压缩,场景图平化,几何编组,状态变化集中。

SimpleUniverse类

概述:

  • 该类可快速地设置一个最小的用户环境,并且很容易使一个Java 3D应用程序运行起来。
  • 该实用程序类创建了场景图中与观察相关的所有必须对象。该类创建了一个Locale、一个单独的ViewingPlatform和一个Viewer观察者对象,其中,该ViewingPlatform和Viewer观察者都是用其所有默认参数创建的。对于很多Java 3D应用程序来说,SimpleUniverse类提供了应用程序所需的全部功能。
  • 但是,对于需要向程序增加更多控制以获得更多功能的复杂应用程序来说,SimpleUniverse类并不适合。

作用

  • SimpleUniverse()构造函数:创建一个Locale,并用其默认参数创建一个一个单独的ViewingPlatform对象和一个Viewer观察者对象。
  • 因此,只要应用了SimpleUniverse()构造函数,就不必再单独创建Locale、ViewingPlatform、Viewer等对象。

结构图

java 3D 第二章 java 3D基本概念_第2张图片

虚线内相当于SimpleUniverse,所以上图等同于下图

java 3D 第二章 java 3D基本概念_第3张图片

Java 3D的三维空间范围

  • Java 3D三维空间范围用来限定特定操作的作用范围,如光照,雾效,可变外观,对三维模型的剪裁等。在该三维空间范围内的三维形体,都将受到作用于该范围内的环境元素的影响。
  • 可以将特定的三维对象、特定的三维空间与特定的环境效果结合起来,只使某种环境效果对某个三维空间范围内的三维形体起作用
  • Java 3D三维空间范围的定义方式包括:长方形空间,球形空间,由一系列平面围成的封闭空间。其中最常用的是球形空间与长方形空间

Java 3D的三维空间范围定义Bounds类
Bounds类对象也常用来确定某种动作或行为的范围。行为和声音只有在它们离观察者足够近的时候才执行或者播放。

    public BoundingSphere(Point3d point3d, double d)
    {
        allocBoxVerts = false;
        tmpBox = null;
        tmpPolytope = null;
        center = new Point3d(point3d);
        radius = d;
        boundId = 2;
        updateBoundsStates();
    }

第一个参数是圆心,第二个是半径。

public Point3d(double d, double d1, double d2)
{
    super(d, d1, d2);
}

注意:Point3d的三个参数都是浮点型。

激活与预编译概念

概念

  • 一个Java 3D场景图由一系列Java 3D节点对象组成。这些节点对象再引用节点组件对象。所有的场景图节点与组件对象是一个公共类SceneGraphObject类的子类
  • SceneGraphObject类是一个抽象类,该类定义了对场景图中的节点与组件对象通用的一些方法

使用

  • 一旦一个SceneGraphObject类的对象被创建,并且连接到其它的场景图对象中而形成一个子图时,则该子图可通过一个Locale节点对象连接到一个VirtualUniverse类或者SimpleUniverse类的虚拟空间节点上,该子图就处于激活状态
  • 在将一个子图加入到一个VirtualUniverse或者SimpleUniverse类的虚拟空间之前,该整个子图预编译优化

注意

  • 所有场景图对象都具有一个很重要特点,就是:只有在创建一个场景图时,这些对象才允许连接或者修改,否则,当这些对象处在激活状态或者预编译状态下,则不允许操作;
  • 除非在该对象处于激活状态或者预编译状态前用能力位显式地定义了“允许”这些操作。

能力位

  • 对处于激活或预编译的场景图节点,通过对象的set与get方法来连接该对象的操作将会受到限制。
  • 每一个对象都有一种能力位集(Capability Set),当该对象处于激活状态或者预编译状态之前,设置针对该对象的某种功能。
  • 在默认情况下,一个对象的所有能力位都被设置为禁用状态。只有在这些对象被编译或者处于激活状态之前,一个对象的set与get方法才能对相应的能力位进行显式地设置激活。

TransformGroup对象的能力位的设置

  • 当创建程序的时候,最好变成激活状态之前或预编译之前通过能力设置这些能力位。
  • 一个TransformGroup对象的能力位的设置如下例,该能力位允许在该节点处于激活状态或预编译状态时对其坐标变换进行“写”操作,也就是“修改”
	      TransformGroup myTrans = new TransformGroup();
	      myTrans.setCapability(Transform.ALLOW_TRANSFORM_WRITE);
	      myTrans.setTransform3D(myT3D)

Java 3D的View类观察模型

概念与定义

  • Java 3D引入了一种新的观察模型,该模型继承了Java语言“编写一次到处运行”的特点,并且包含了显示设备和一个六自由度的外部输入设备(如头盔追踪装置)。这种新的观察模型的“编写一次到处运行” 的特点意味着应用Java 3D观察模型编写的应用程序在不修改场景图的情况下能够将可视化后的图像显示到各种不同的显示设备上,如计算机显示器、多投影显示室、头盔式显示器。它也意味着同样的Java 3D应用程序,同样不用修改,就能对立体视图可视化,并且可通过来自头盔跟踪器的输入对观察到的视图实施控制。

  • Java 3D应用程序控制ViewPlatform对象(一个viewpoint观察点)的位置和方向,而Java 3D可视化器应用这个观察点的位置和观察方向来计算生成相关视图,这是在物理世界环境下对用户所处的物理环境与用户所在位置和观察方向的一种描述。

  • Java 3D的观察模型集成了头盔直接跟踪的功能,无需附加操作,在虚拟世界中就能使用户具有身临其境的感觉。

  • Java 3D的观察模型在没有头盔跟踪环境以及将图形可视化到一个标准显示器的情况下,具有透明地产生立体视图的附加功能。

  • Java 3D 的观察模型在用户所处的物理世界与Java 3D应用程序的虚拟世界之间也定义了一种最基本的对应。这种从物理世界到虚拟世界的对应关系定义了一个唯一的公用空间

虚拟世界是一个各种虚拟对象共存的公共空间。虚拟世界坐标系和在一个Locale节点中的高精度大尺度坐标系相关。在每一个Locale对象里,对所有虚拟对象,定义了一个虚拟世界坐标系的原点。

View类对象

  • 包含当前处于激活状态(连接到场景图对象形成子图)的ViewPlatform对象的Locale节点定义可视化的坐标系。Java 3D最终将所有与场景图元素相关的坐标转换到这个公共的虚拟世界空间中。

  • ViewPlatform是一个叶子节点,用来确定在一个场景图中的观察点。ViewPlatform的父节点(TransformGroup)在一个虚拟世界中确定该视点的位置、观察方向、比例

  • View是主要的view观察对象,包含多种view状态。

  • Canvas3D是AWT (Abstract Windowing Toolkit)的Canvas对象的3D版。它提供了一个窗口用来显示Java 3D的图象。

  • Canvas3D对象包含一个针对Screen3D对象的一个引用,并且包含有在Screen3D对象内定义Canvas3D对象的尺寸、形状和位置的信息。

  • Screen3D对象包含描述显示器物理属性的信息。Java 3D将显示器的信息放在一个独立的对象中定义是为了防止与每一个Canvas3D对象中定义的屏幕信息重复

  • PhysicalBody是一个包含描述用户物理身体的尺度信息。

  • PhysicalEnvironment: 该对象包含有描述物理世界的尺度信息。如果外部跟踪硬件存在,则在

  • PhysicalEnvironment对象中主要包含了描述环境中六自由度跟踪硬件的尺度信息。

综上所述,这些对象描述了与观察有关的几何信息,而不是显式地提供一个观察或投影矩阵。Java 3D可视化器应用这些信息来生成合适的观察和投影矩阵。这些观察对象的几何信息对产生视图提供了更大的灵活性,进而可支持不同的显示配置。

行为与插值器(Behaviors and Interpolators)

行为Behaviors
  • Behavior类节点对实现动态图形提供了一种手段,通过处理来自键盘和鼠标的输入,对相关移动作出响应,以及激活与处理拾取事件。

  • Behavior类节点包含Java编码和状态变量。一个Behavior节点的Java编码能够与Java对象进行交互,在一个Java 3D的场景图中改变相关节点的值,改变Behavior节点内部状态,执行相关计算。

  • 简单的行为就能够对一个场景图增加特别有趣的效果。例如,通过应用一个Behavior节点来重复地修改相关的TransformGroup节点,可使一个刚性的物体动起来。

    • 另一种情况是,一个Behavior节点能够跟踪当前鼠标的位置和状态,对当前鼠标的位置和状态作出相关响应,并修改当前场景图中的相关部分内容
  • Behavior类叶子节点对象包含了一种时序安排区域和==两种方法==,这两种方法如下:

    • initialize()方法:当Behavior变为激活状态时该方法只调用一次。

    • processStimulus()方法,当Java 3D的Behavior行为调度程序(Behavior Scheduler)认为适当时就调用该方法。

    • 上述两个方法是抽象方法:

        public abstract void initialize();
    
        public abstract void processStimulus(Enumeration enumeration);
    	//Enumeration是个接口
    
    • Behavior对象包含了initialize()方法和processStimulus()方法需要的状态信息。
  • Behavior的作用区域(Scheduling Region)是一种三维空间,主要用来使Behavior节点的计划动作在该区域处于激活状态。每当一个处于激活状态的ViewPlatform对象的激活空间与一个Behavior对象的作用范围相交时,则该Behavior节点处于激活状态时,能够接受相关唤醒信息。

  • processStimulus方法接收和处理一个Behavior行为的持续信息。当一个处于激活状态的ViewPlatform对象的激活空间与一个Behavior对象的作用范围相交,并且该行为的全部唤醒条件都满足时,Java 3D的==行为调度器将会调用一个Behavior节点的processStimulus方法==。processStimulus方法执行相关计算,作出相关动作,建立它的下一个唤醒条件,并最终退出

  • 当Java 3D Behavior调度程序调用一个Behavior对象的processStimulus方法时,则该方法可执行任何计算。通常,该方法将改变其内部状态,并且产生其新的唤醒条件

  • Behavior的编码只允许改变一个场景图元素的能力位所允许改变的部分。一个场景图的相关能力位的设置限制Behavior行为的相关操作

  • Java 3D应用程序必须提供Behavior对象的操作对象。这种操作对象在创建Behavior对象时通过Behavior的构造函数中的相关参数确定。

    ​ 另一种情况,当Java 3D应用程序调用它的初始化方法时,或者每一次Java 3D应用程序调用它的processStimulus方法时,Behavior对象本身能够获得对相关场景图元素的连接

	  Behavior behavior = new Behavior() {
		
		@Override
		public void processStimulus(Enumeration enumeration) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void initialize() {
			// TODO Auto-generated method stub
			
		}
	};
同步显示执行
  • 一个典型的Behavior行为将修改场景图中的一到多个节点或者节点组件。这种修改与可视化过程是并行发生的。

  • 一般情况下,应用程序不会期望行为的执行与显示同步。但是有两种例外情况:

    • 单一的Behavior行为实例的processStimulus方法对场景图对象所作的全部修改都保证会在同样的显示框架内产生效果,这不包括引用的几何体或者引用的纹理。
    • 多个Behavior行为的processStimulus方法对一个WakeupOnElapsedFrames(0)唤醒条件的响应而对场景图对象所作的所有修改将保证会在同样的显示框架内产生效果,这不包括引用的几何体或者引用的纹理。

    1.i=0

        public WakeupOnElapsedFrames(int i)//i=0
        {
            this(i, false);//使用带两个参数的构造方法
        }
    

    2.上文this(i, false);(0,false)

        public WakeupOnElapsedFrames(int i, boolean flag)//(0,false)
        {
            if(i < 0)
            {
                throw new IllegalArgumentException(J3dI18N.getString("WakeupOnElapsedFrames0"));
            } else
            {
                frameCount = i;
                passive = flag;
                WakeupIndexedList.init(this, 1);
                return;
            }
    

    3.上文WakeupIndexedList.init(this, 1);

        static final void init(WakeupCondition wakeupcondition, int i)
        {
            wakeupcondition.listIdx = new int[2][i];
            for(int j = 0; j < i; j++)
            {
                wakeupcondition.listIdx[0][j] = -1;
                wakeupcondition.listIdx[1][j] = -1;
            }
    
        }
    

    4.从WakeupCondition类获得对象

Behavior与唤醒(Wakeup… )
  • Behavior方法具有一种刚性结构。Java 3D假定这些方法总能运行到最后(如果需要,可以产生线程)。每个方法最基本结构包含下列几个方面:

    • 从WakeupCondition对象的条件中提取相关参数以使对象激活;
    • 执行与WakeupCondition相关的各种操作;
    • 创建这种Behavior行为新的WakeupCondition条件;
    • 相关程序执行完返回Java 3D行为调度器(Behavior Scheduler)。
  • WakeupCondition唤醒条件对象是一个抽象的类,主要用来组织和处理不同的WakeupCriterion唤醒标准对象。一个Behavior节点给Java 3D行为调度器提供一个WakeupCondition对象。当WakeupCondition的条件满足了之后,Java 3D行为调度器则将同样的WakeupCondition通过一个参数返回到这个Behavior。

  • WakeupCriterion(WakeupCondition的子类)唤醒标准对象,Java 3D提供了丰富的唤醒标准,这可使Behavior对象能在一个复杂的WakeupCondition条件下使用。这些唤醒条件能使Java 3D行为调度器在需要的时候调用一个Behavior对象的processStimulus方法

唤醒标准

一个激活状态的ViewPlatform的中心进入一个限定区域;一种Behavior行为被激活;当一个激活状态的ViewPlatform的中心退出一个限定区域;一种Behavior行为被解除激活状态;

Behavior与组合
  • 组合WakeupCriterion对象
    一个Behavior对象能够组合多个WakeupCriterion对象来形成一个功能强大的.组合的WakeupCondition对象。Java 3D的Behavior对象以下列方式之一来构造一个组合的WakeupCondition对象:

    • WakeupAnd: WakeupCriterion && WakeupCriterion && …;
    • WakeupOr: WakeupCriterion || WakeupCriterion || …;
    • WakeupAndOfOrs: WakeupOr && WakeupOr && …;
    • WakeupOrOfAnds: WakeupAnd || WakeupAnd ||
  • 组合Behaviors行为
    Behavior行为对象只能以来自其它Behavior节点的信号作为条件来激活它自己。

    • WakeupOnBehaviorPost的WakeupCriterion唤醒标准对象,以一个Behavior节点与一个整数作为条件。这两个参数允许一个Behavior对象以来自特定的Behavior行为的特定消息(post)作为其唤醒条件。
    • WakeupOnBehaviorPost的WakeupCriterion唤醒标准对象允许多个Behavior行为节点链接(chain)它们的计算,也就是第一种Behavior行为打开一个门,第二个Behavior行为关闭这个门,或者第一种Behavior行为高光显示一个对象,第二个Behavior行为关闭这种高光显示。

对Behavior行为的调度(Scheduling)

  • 当一个虚拟空间变得比较大时,Java 3D为了保证适当的运行效果必须节俭地使用其资源。在一个具有一万个对象的虚拟空间中,具有大概400个Behavior行为节点。在这种情况下,一次不节俭的Java 3D执行可能很快会耗尽绝大多数的计算机时间,这使得图像的刷新速率可能降到无法接受的水平。

  • 在一个给定的时间段内,只有少数几个与几何对象相关的Behavior对象将是可见的。相当大一部分Behavior行为节点和那些不可见的对象相关,无需执行。只有那些相对少数的与可见对象相关的Behavior对象是必须执行的。

  • Java 3D通过对高度相关的Behavior对象的选择调用来缓解这个问题。

内插器行为(Interpolator Behaviors)

**定义:**之所以称为内插器是因为它们能够在两个极端值之间进行光滑插值

**功能:**在一个TransformGroup中操作坐标变换,修改一个Switch节点的值,并且修改诸如颜色、透明度等Material材质属性的值。

组成:
这种预定义的Interpolator内插器行为将时间序列值转换成一种alpha值。一个Interpolator内插器由两部分组成一个是所有Interpolator内插器共享的通用部分,与一个和域相关的部分

  • 通用部分将以毫秒为单位的时间匹配到[0.0,1.0]区间中的值。
  • 域相关的部分将一个在[0.0,1.0] 区间的alpha值匹配成一种预定义好的行为的输出值范围内的一种值。alpha值0.0生成一个内插器的最小值,alpha值1.0生成一个内插器的最大值,介于0.0与1.0之间的值则生成介于最大与最小值之间的一个值

Alpha值

  • 将时间匹配成Alpha值(Mapping Time to Alpha),有几个参数控制将时间匹配成一个alpha值(可参考Alpha对象的API描述)。当这些参数不改变时,这种匹配就一直存在。
  • 因此,具有相同参数的两种不同的内插器对给定的同一个时间值将产生相同的alpha值。这就意味着,即使插值器在不同的线程或者甚至在不同的处理器上(只要这些处理器具有统一的时钟),虽然插值器之间不相互通信,两种不同的插值器还是能够精确地协调它们的活动

你可能感兴趣的:(#,JavaSE基础和进阶知识,java,3d,开发语言)