VRMLの座標
VRMLで使用する座標は次の図に示すように、x軸は横方向(右が正の方向、左が負の方向)、y軸は縦方向(上が正の方向、下が負の方向)、z軸は前後方向(後退する方向が正の方向、前進する方向が負の方向)です。座標は(x, y, z)座標で表し、点(1.7, 2.8, 2)の位置は図のようになります。
Transformノードは立体をグループ(立体が1つだけのグループもある)化し、そのグループのもつ座標(ローカル座標)を変換します。立体のグループはchildrenフィールドで指定します。childrenフィールドには、さらにTransformノードで座標変換された立体のグループを含むことができます。VRMLのブラウザで表示されるのは、Transformノードの外側の一番基本の座標系からみたものです。この座標系もまたTransformノードでローカル座標系として座標変換されます。
次にTransformノードの定義形式を示します。
Transform {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField SFVec3f center 0 0 0
exposedField MFNode children []
exposedField SFRotation rotation 0 0 1 0
exposedField SFVec3f scale 1 1 1
exposedField SFRotation scaleOrientation 0 0 1 0
exposedField SFVec3f translation 0 0 0
field SFVec3f bboxCenter 0 0 0
field SFVec3f bboxSize -1 -1 -1
}
|
- childrenフィールド
- childrenフィールドには座標変換のグループとなる立体を定義しているノード(ShapeノードやTransformノード)を記述します。記述例を次に示します。
#VRML V2.0 utf8
#Transform と children
Transform {
translation 1 0 0
children [
Shape {
....
}
Transform {
translation 0 -1 0
childen [
Transform {
translation 0 0 2
children [ ..... ]
}
]
}
]
}
|
- translationフィールド
- translationフィールドに指定した座標点の位置にローカル座標の原点を移動します。次の図に2つのローカル座標系を示します。ローカル座標系(x1,y1,z1)は原点を(1.7, 2.8, 2)へ移動したもの、ローカル座標系(x2,y2,z2)は原点を(-0.8, 2, 2)へ移動したものです。
- rotationフィールド
- rotationフィールドには3次元ベクトルと角度を指定します。ローカル座標は、指定されたベクトルを軸にして、指定された角度(単位はラジアン)だけ回転します。次の図は、Transformノードに
translation 1 2 1 rotation 0 0 -1 t
|
を指定した例で、ローカル座標系(x1',y1',z1')は、原点を(1, 2, 1)に移動して、ベクトル(0 0 -1)を軸に角度tだけ回転したものです。z1軸が回転の軸なのでz1軸とz1'軸は重なっています。
- centerフィールド
- centerフィールドはrotationフィールドとともに指定します。centerフィールドに指定された座標点を中心に座標を回転します。ここで指定する中心の座標は、translationで移動したローカル座標系での座標です。次の図は、Transformノードに
translation 1 2 1 center 0 -1 0 rotation 0 0 -1 t
|
を指定した例で、ローカル座標系(x1',y1',z1')は、原点を(1, 2, 1)に仮に移動して(ローカル座標系(x1,y1,z1))、そこでの座標点(0 -1 0)を中心にして、ベクトル(0 0 -1)を軸に角度tだけ回転したものです。
- scaleフィールド
- scaleフィールドはスケールを指定します。scaleフィールドに指定された値でローカル座標の各軸のスケールを決めます。次の図は、
Transform{ #scale
translation 0 0 0
scale 1.5 0.5 1.5
children [
Transform{
translation 1 2 1
children [ ...... ]
}
]
}
|
を指定した例で、1つめのTransformノードのローカル座標系(x1,y1,z1)は原点を移動していませんので座標系(x0,y0,z0)と同じ位置にありますが、スケール(1.5 0.5 1.5)が指定されていますので、その中のローカル座標系はすべてスケール(1.5 0.5 1.5)で表示されます。
- scaleOrientasionフィールド
- scaleOrientasionフィールドは、scaleフィールドとともに使用します。scaleOrientasionフィールドで指定したベクトルを軸に指定した角度だけ回転した座標系に、scaleフィールドに指定されたスケールを適用します。次の図は、
Transform{ #scaleOrientation
translation 0 0 0
scaleOrientasion 0 0 -1 t
scale 1.5 0.5 1.5
children [
Transform{
translation 1 2 1
children [ ...... ]
}
]
}
|
を指定した例で、1つめのTransformノードのローカル座標系(x1,y1,z1)はscaleOrientasionフィールドに指定されたベクトル(0 0 -1)を軸に角度t回転しています。スケール(1.5 0.5 1.5)が指定されていますので、その中のローカル座標系はすべてスケール(1.5 0.5 1.5)で表示されます。
Viewpointノードは視点の位置と視線の方向を決めるノードです。次にViewpointノードの定義形式を示します。
Viewpoint {
eventIn SFBool set_bind
exposedField SFFloat fieldOfView 0.785398
exposedField SFBool jump TRUE
exposedField SFRotation orientation 0 0 1 0
exposedField SFVec3f position 0 0 10
field SFString description ""
eventOut SFTime bindTime
eventOut SFBool isBound
}
|
視点の位置はpositionフィールド、視線の方向はorientationフィールドで指定します。Viewpointノードを記述しない場合はデフォルトのビューポイントになり、視点の位置は(0, 0, 10)で方向はz軸のマイナスの方向です。次の図にデフォルトのビューポイントを示します。左の図はビューポイントの位置、右の図は座標の原点に置かれた直方体の見え方を示しています。
- positionフィールド
- positionフィールドには、視点の位置の座標を3次元のベクトル値で与えます。Viewpointノードを
Viewpoint {
position 2.0 1.0 10.0
}
|
と記述した場合は、次の左の図に示すように視点の位置は(2,1,10)になります。そのときの、視界の変化を右の図に示しています。視点の位置がx軸の正の方向に2、y軸の正の方向に1移動しましたので、視界にあるものは逆にx軸の負の方向に2、y軸の負の方向に1移動したように見えます。
- orientationフィールド
- orientationフィールドは視線の方向を指定します。orientationフィールドには、回転の軸となるベクトルと回転の角度(単位はラジアン)を与えます。Viewpointノードを
Viewpoint {
position 2.0 1.0 10.0
orientation 0.0 0.0 -1.0 t
}
|
と記述した場合は、positionフィールドは前の例と同じですので、次の左の図に示すように、視点の位置は(2,1,10)になります。それに回転を加えます。そのときの、視界の変化を右の図に示しています。まず視点の位置は前の例と同じ位置に移動し、さらにベクトル(0.0, 0.0, -1.0,)を軸にして角度tだけ回転します。回転の方向は逆に回転したように見えます。
- 回転の方向と視界の変化
- z軸の負の方向を軸に視線の方向を回転する(首を右へ傾ける)と視界は左へ回転するように見えます。
x軸の負の方向を軸に視線の方向を回転する(首を下へ向ける)と視界は上へ回転するように見えます。
y軸の負の方向を軸に視線の方向を回転する(首を右へ回す)と視界は左へ回転するように見えます。
- descriptionフィールド
- descriptionフィールドでビューポイントの名前を付けることができます。VMRLファイルの中にいくつかのビューポイントが指定されている場合は、VRMLブラウザは最初に指定されているビューポイントで表示します。その後ユーザがブラウザのビューポイントリストのボタンを操作してビューポイント名を選び、ビューポイントの位置を変えて表示できます。