定义与运用:
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 ) |
原理:
每个整形数组元素都是从20-231,而最终的8元素的整形数组由计算机计算。例如:{0,0,0,0,1,1,0,0}此时会由计算机按128-127位对其计算
实线箭头代表父节点到子节点的链接,虚线箭头代表引用
场景图观察对象
Java 3D定义了5个场景图观察对象,用来定义观察参数,并提供与物理世界的联系。这些对象包括:Canvas3D(画布),Screen3D(显示屏),View(观察),PhysicalBody(物理人体),PhysicalEnvironment(物理环境)。
一个ViewPlatform(观察平台)叶子节点在虚拟世界中定义了一个坐标系和一个具有相关原点或参考点的参考框架。ViewPlatform作为观察对象的依附点,并且作为一个可视化器观察的基点。 (ViewPlatform是上面五个观察对象的子节点,上图有!)
ViewPlatform(观察平台)
Canvas3D(画布)
Screen3D对象
View对象
PhysicalBody对象、PhysicalEnvironment对象
场所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坐标系原点的创建
默认情况下Java 3D坐标系:
默认情况下,Java 3D坐标系采用右手坐标系统,坐标系原点在显示器的中心,x轴水平向右,y轴垂直向上,z轴指向观察者。默认情况下,坐标单位为米。
Java 3D将节点对象分为两个子类
Group节点
Leaf节点(叶子节点)
Leaf节点包含几何元素、光源、声音等具体信息的定义。一个Leaf节点没有子节点,但只有一个父节点。
Shape3D节点、Light节点、ViewPlatform节点、Behaviors节点等都是叶子节点。
节点组件对象
Java 3D的观察模型集成了头盔直接跟踪(Head-Tracked)的功能,无需附加操作,在虚拟世界中就能使用户具有身临其境的感觉。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()方法实现。
混合立即模式
概述:
作用
结构图
虚线内相当于SimpleUniverse,所以上图等同于下图
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的三个参数都是浮点型。
概念
使用
注意
TransformGroup myTrans = new TransformGroup();
myTrans.setCapability(Transform.ALLOW_TRANSFORM_WRITE);
myTrans.setTransform3D(myT3D);
Java 3D引入了一种新的观察模型,该模型继承了Java语言“编写一次到处运行”的特点,并且包含了显示设备和一个六自由度的外部输入设备(如头盔追踪装置)。这种新的观察模型的“编写一次到处运行” 的特点意味着应用Java 3D观察模型编写的应用程序在不修改场景图的情况下能够将可视化后的图像显示到各种不同的显示设备上,如计算机显示器、多投影显示室、头盔式显示器。它也意味着同样的Java 3D应用程序,同样不用修改,就能对立体视图可视化,并且可通过来自头盔跟踪器的输入对观察到的视图实施控制。
Java 3D应用程序控制ViewPlatform对象(一个viewpoint观察点)的位置和方向,而Java 3D可视化器应用这个观察点的位置和观察方向来计算生成相关视图,这是在物理世界环境下对用户所处的物理环境与用户所在位置和观察方向的一种描述。
Java 3D的观察模型集成了头盔直接跟踪的功能,无需附加操作,在虚拟世界中就能使用户具有身临其境的感觉。
Java 3D的观察模型在没有头盔跟踪环境以及将图形可视化到一个标准显示器的情况下,具有透明地产生立体视图的附加功能。
Java 3D 的观察模型在用户所处的物理世界与Java 3D应用程序的虚拟世界之间也定义了一种最基本的对应。这种从物理世界到虚拟世界的对应关系定义了一个唯一的公用空间。
虚拟世界是一个各种虚拟对象共存的公共空间。虚拟世界坐标系和在一个Locale节点中的高精度大尺度坐标系相关。在每一个Locale对象里,对所有虚拟对象,定义了一个虚拟世界坐标系的原点。
包含当前处于激活状态(连接到场景图对象形成子图)的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可视化器应用这些信息来生成合适的观察和投影矩阵。这些观察对象的几何信息对产生视图提供了更大的灵活性,进而可支持不同的显示配置。
Behavior类节点对实现动态图形提供了一种手段,通过处理来自键盘和鼠标的输入,对相关移动作出响应,以及激活与处理拾取事件。
Behavior类节点包含Java编码和状态变量。一个Behavior节点的Java编码能够与Java对象进行交互,在一个Java 3D的场景图中改变相关节点的值,改变Behavior节点内部状态,执行相关计算。
简单的行为就能够对一个场景图增加特别有趣的效果。例如,通过应用一个Behavior节点来重复地修改相关的TransformGroup节点,可使一个刚性的物体动起来。
Behavior类叶子节点对象包含了一种时序安排区域和==两种方法==,这两种方法如下:
initialize()方法:当Behavior变为激活状态时该方法只调用一次。
processStimulus()方法,当Java 3D的Behavior行为调度程序(Behavior Scheduler)认为适当时就调用该方法。
上述两个方法是抽象方法:
public abstract void initialize();
public abstract void processStimulus(Enumeration enumeration);
//Enumeration是个接口
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行为将修改场景图中的一到多个节点或者节点组件。这种修改与可视化过程是并行发生的。
一般情况下,应用程序不会期望行为的执行与显示同步。但是有两种例外情况:
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方法具有一种刚性结构。Java 3D假定这些方法总能运行到最后(如果需要,可以产生线程)。每个方法最基本结构包含下列几个方面:
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行为被解除激活状态;
组合WakeupCriterion对象
一个Behavior对象能够组合多个WakeupCriterion对象来形成一个功能强大的.组合的WakeupCondition对象。Java 3D的Behavior对象以下列方式之一来构造一个组合的WakeupCondition对象:
组合Behaviors行为
Behavior行为对象只能以来自其它Behavior节点的信号作为条件来激活它自己。
对Behavior行为的调度(Scheduling)
当一个虚拟空间变得比较大时,Java 3D为了保证适当的运行效果必须节俭地使用其资源。在一个具有一万个对象的虚拟空间中,具有大概400个Behavior行为节点。在这种情况下,一次不节俭的Java 3D执行可能很快会耗尽绝大多数的计算机时间,这使得图像的刷新速率可能降到无法接受的水平。
在一个给定的时间段内,只有少数几个与几何对象相关的Behavior对象将是可见的。相当大一部分Behavior行为节点和那些不可见的对象相关,无需执行。只有那些相对少数的与可见对象相关的Behavior对象是必须执行的。
Java 3D通过对高度相关的Behavior对象的选择调用来缓解这个问题。
**定义:**之所以称为内插器是因为它们能够在两个极端值之间进行光滑插值
**功能:**在一个TransformGroup中操作坐标变换,修改一个Switch节点的值,并且修改诸如颜色、透明度等Material材质属性的值。
组成:
这种预定义的Interpolator内插器行为将时间序列值转换成一种alpha值。一个Interpolator内插器由两部分组成一个是所有Interpolator内插器共享的通用部分,与一个和域相关的部分。
Alpha值