VRMLの座標

 VRMLで使用する座標は次の図に示すように、x軸は横方向(右が正の方向、左が負の方向)、y軸は縦方向(上が正の方向、下が負の方向)、z軸は前後方向(後退する方向が正の方向、前進する方向が負の方向)です。座標は(x, y, z)座標で表し、点(1.7, 2.8, 2)の位置は図のようになります。



Transform(座標変換)

 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ノードの定義形式を示します。


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ブラウザは最初に指定されているビューポイントで表示します。その後ユーザがブラウザのビューポイントリストのボタンを操作してビューポイント名を選び、ビューポイントの位置を変えて表示できます。