分类:
2009-09-02 15:27:40
在VRML中,Transform节点是一个基本结构,它是一个常见的群组节点(Grouping node),可以作许多物体的容器。然而,Transform提供了更强大的功能,在计算机图形中,“运动”总是和变换(transformation)紧密相连的—无论是缩放比例、旋转或是平移。VRML2.0中,Transform节点将其定义的变换施加于物体。它的各字段的缺省值定义如下:
Transform {
center 0 0 0
translation 0 0 0
rotation 0 0 1 0
scale 1 1 1
scaleOrientation 0 0 1 0
children [ ]
}
VRML场景图包含许多群组节点以便定义一个方便的等级来操纵场景。当然,也可以把Transform和其它节点组成群组节点(例如,在一个物体等级的内部某一层放置一个传感器,用一个事件触发它,但同时又保留着操纵整个组活动的能力)。
Transform
字段的值,例如旋转,可以由任何Shape节点或它的子节点所继承。子节点的关键字children声明其下面方括号中的节点是父组节点的子节点。在程序例1.4中,我们将介绍场景中名为CUBE的Box和它的外观,然后用Transform父组节点缩放和旋转Box。程序例5.2.4 cube.wrl
#VRML V2.0 utf8
#move the Box
DEF transformCUBE Transform {
translation –3.0 2.0 1.0
children [
DEF CUBE Shape {
appearance Appearance {
material Material {
diffuseColor 1 0 0
specularColor 0.9 0.9 0.9
}
}
geometry Box { }
}
]
}
图5-2-4 cube.wrl
在此例中,Box节点的位置被转移,沿Z轴的负轴向左平移了3米,沿Y轴正轴向上移了2米,沿Z轴正轴方向移了1米。
注意:无论何时你使用群组节点来管理VRML场景图形元素,都必须在子节点字段中指定群组节点的内容。父节点定义了本地的坐标空间,子节点从父节点中继承了Transform,依次地这些父节点又继承了它们的父节点中的Transform,使得本地的translation、scaling或rotation 变换经常与较高群组的最后的Transform执行有关。也就是说,群组节点的Transform字段在结构中积累。
为了检验这个等级结构继承关系,我们在场景中同时对TransformCUBE、TransformCONE群组节点内外添加几何图形对象。
程序例5.2.5 vrmllogo.wrl
#VRML V2.0 utf8
#move the Box
DEF transformCUBE Transform {
translation -3.0 2.0 1.0
children [
DEF CUBE Shape {
appearance Appearance {
material Material{
diffuseColor 1 0 0
specularColor 0.9 0.9 0.9
}
}
geometry Box{}
}
DEF transformBALL Transform {
translation 3.0 –2.0 0
children [
DEF BALL Shape {
appearance Appearance {
material Material{
diffuseColor 1 0 0
specularColor 0.9 0.9 0.9
}
}
geometry Sphere{}
}
]
}
]
}
DEF transformCONE Transform {
translation 3 0 0
children [
DEF CONE Shape {
appearance Appearance {
material Material {
diffuseColor 0 0 1
specularColor 0.9 0.9 0.9
}
}
geometry Cone{}
}
]
}
DirectionalLight {
direction -1 -1 -5
intensity 0.8
}
图5-2-5 vrmllogo.wrl
CONE是在transformCUBE层的外部定义的,它提供了一个指向CUBE和BALL的translation的参考值。CONE不受在CUBE和BALL中完成的Transform的影响。然而,由于BALL的Transform父被定义为CUBE的Transform父的子,所以BALL继承了相同的CUBE Transform。
正如例中看到的那样,一个群组节点可以被另一个群组节点所包含(相同或不相同类型)并继承它父节点Transform包含的变换。如果CONE对象也包含在这种等级中,那么整个场景将通过高层的Transform的单一变换在3D空间中移动。这种能力在场景图变得复杂时非常有用。
对象的旋转可以通过设置Transform父组节点的Rotation字段值来实现。Rotation字段接受三个在-1.0到1.0区间的值,这三个值表示旋转轴的方向,其后跟随一个用弧度表示的旋转量。例如,取Rotation值为(1 0 0),则定义X轴为旋转轴。旋转的角度是以弧度形式表示的;旋转角的正负,可用右手规则判别。
程序例5.2.6 Rotation.wrl
#VRML V2.0 utf8
DEF transformCUBE Transform {
translation -3.0 2.0 1.0
rotation -1 1 0.8 0.785
children [
DEF CUBE Shape {
appearance Appearance {
material Material{
diffuseColor 1 0 0
specularColor 0.9 0.9 0.9
}
}
geometry Box{}
}
]
}
DEF transformBALL Transform {
translation 0.0 2.0 1.0
children[
DEF BALL Shape{
appearance Appearance {
material Material{
diffuseColor 1 0 0
specularColor 0.9 0.9 0.9
}
}
geometry Sphere{}
}
]
}
DEF transformCONE Transform {
translation 3 2 1
rotation 0.5 0.1 0.75 0.785
children [
DEF CONE Shape {
appearance Appearance {
material Material {
diffuseColor 0 0 1
specularColor 0.9 0.9 0.9
}
}
geometry Cone{}
}
]
}
DirectionalLight {
direction -2 1 -5
intensity 0.8
}
图5-2-6 Rotation.wrl
改变对象的比例可以通过设置Transform父组节点的Scale字段值来实现。该字段的三个值分别表示沿X、Y、Z轴的比例缩放因子。
程序例5.2.7 cyl.wrl
#VRML V2.0 utf8
Transform{
scale 0.5 1 1 #比例缩放
children [
Transform{
rotation 0 0 1 -1.57 #旋转
children [
Shape{geometry Cylinder{}}
]
}
]
}
图5-2-7 cyl.wrl
使用Center字段定义任意一点,从这点可以计算Transorm层的子节点的translation、rotation或scale,这样就可以抵消对场景或物体所作的Transform的操作。Scale操作可以进一步使你为Transform的ScaleOrienta tion字段赋一个矢量值,完成改变大小前对本地坐标系的旋转。