立体の形状

Shape

 Shapeノードは立体の形状を定義します。定義形式を次に示します。


Shape { 
  exposedField SFNode appearance NULL
  exposedField SFNode geometry   NULL
        ↑                   ↑              ↑          ↑ 
 フィールドの属性  フィールドの型  フィールド名  デフォルト値
} 

 Shapeノードには、立体の形を決める geometryノード(Box などのノード)を記述した geometryフィールドが1つ含まれます。立体の外観の色などを決める appearanceノードは省略でき、次に示すものが最小の形式です。


#VRML V2.0 utf8
    
Shape {
   geometry Box{  }
}


Geometry

 geometryフィールドには geometryノードを記述します。  geometryノードには、次に示す Box、Cylinder、Sphere、Text、IndexedFaceSet、IndexedLineSet、PointSet、Extusion、ElevationGridがあります。
 各フィールドの定義形式について、Boxを例に説明します。


Box { 
   field        SFVec3f    size  2 2 2
        ↑                   ↑              ↑        ↑ 
 フィールドの属性  フィールドの型  フィールド名 デフォルト値
} 

Box { 
  size 2 1 3
} 

 左側が定義形式です。フィールドの属性はフィールド値をどのように扱うかを定義するものです。フィールドの型はフィールドの設定する値の型で、SFVec3fは3次元のベクトル値で実数を3つ、x,y,zの順に並べたものです。詳細は「VRMLの構造」の「フィールドの属性と型」を参照してください。
 右側は、3辺の長さがx方向に2、y方向に1、z方向に3のBoxを記述したものです。


Box

 Boxは直方体を作るノードで次の形式です。sizeフィールドで直方体の3辺の大きさを設定します。デフォルト値は1辺が2の立方体です。


Box { 
   field    SFVec3f size  2 2 2 
} 


Cone

 Coneは円錐を作るノードで次の形式です。


Cone { 
  field     SFFloat   bottomRadius 1       
  field     SFFloat   height       2       
  field     SFBool    side         TRUE 
  field     SFBool    bottom       TRUE 
}

 bottomRadiusフィールドは円錐の底面の半径、heightフィールドは高さです。sideフィールドとbottomフィールドは側面や底面を表示する場合は TRUE、表示しない場合は FALSEとします。


Cylinder

 Cylinderは円柱を作るノードで次の形式です。


Cylinder { 
  field    SFBool    bottom  TRUE
  field    SFFloat   height  2  
  field    SFFloat   radius  1  
  field    SFBool    side    TRUE
  field    SFBool    top     TRUE
}

 radiusフィールドは円柱の半径、heightフィールドは高さです。side、bottom、topフィールドは側面や底面や上面を表示する場合は TRUE、表示しない場合は FALSEとします。


Sphere

 Sphereは球を作るノードで次の形式です。radiusフィールドは球の半径です。


Sphere { 
  field SFFloat radius  1
}


Text

 Textは文字を作るノードで次の形式です。


Text { 
  exposedField  MFString string    []
  exposedField  SFNode   fontStyle NULL
  exposedField  MFFloat  length    [] 
  exposedField  SFFloat  maxExtent 0.0 
}

 stringフィールドには文字列を指定します。 ["Hosei Univ."]のように記述します。日本語は使用できません。fontStyleフィールドでは、FontStyleノードでフォントやサイズなどを指定します。具体例は「shapeの例」参照してください。

FontStyle

 fontStyleフィールドのFontStyleノードで文字のフォント・サイズや並べ方を指定します。


FontStyle { 
  field MFString family       "SERIF"
  field SFBool   horizontal   TRUE
  field MFString justify      "BEGIN"
  field SFString language     ""
  field SFBool   leftToRight  TRUE
  field SFFloat  size         1.0  
  field SFFloat  spacing      1.0  
  field SFString style        "PLAIN"
  field SFBool   topToBottom  TRUE
}

 FontStyleノードのフィールドについて以下に示します。

family
フォントを指定します。"SERIF", "SANS", "TYPEWRITER"があります。
style
スタイルを指定します。"PLAIN", "BOLD", "ITALIC", "BOLDITALIC"があります。
size
文字のサイズ(高さ)を指定します。
spacing
1行の幅を指定します。
horizontal
TRUE:文字を水平に書きます。FALSE:文字を縦に書きます。
leftToRight
horizontalがTRUEのとき:TRUEは文字を左から右へ、FALSEは文字を右から左へ書きます。
topToBottom
horizontalがFALSEのとき:TRUEは文字を上から下へ、FALSEは文字を下から上へ書きます。
justify
Textノードのlengthフィールドで指定した長さの幅の中の文字の位置を決めます。horizontalフィールド、leftToRightフィールド、topToBottomフィールドとの関連によって異なります。justifyフィールドの値には、"FIRST", "BEGIN", "MIDDLE", "END"があります。


IndexedFaceSet

 IndexedFaceSetは多面体(面だけの場合を含む)を作るノードで次の形式です。coordフィールドで頂点の座標を与え、coordIndexフィールドで面の構成を記述します。colorフィールドで頂点または面の色を指定します。具体的な例は「shapeの例」を参照してください。


IndexedFaceSet { 
  eventIn       MFInt32 set_colorIndex
  eventIn       MFInt32 set_coordIndex
  eventIn       MFInt32 set_normalIndex
  eventIn       MFInt32 set_texCoordIndex
  exposedField  SFNode  color             NULL
  exposedField  SFNode  coord             NULL
  exposedField  SFNode  normal            NULL
  exposedField  SFNode  texCoord          NULL
  field         SFBool  ccw               TRUE
  field         MFInt32 colorIndex        []   
  field         SFBool  colorPerVertex    TRUE
  field         SFBool  convex            TRUE
  field         MFInt32 coordIndex        [] 
  field         SFFloat creaseAngle       0  
  field         MFInt32 normalIndex       [] 
  field         SFBool  normalPerVertex   TRUE
  field         SFBool  solid             TRUE
  field         MFInt32 texCoordIndex     []  
}


Coordinate

 CoordフィールドのCoordinateノードで多面体の頂点の座標を指定します。


Coordinate { 
  exposedField MFVec3f point  [] 
}

 pointフィールドには頂点の座標を3次元ベクトル値で、頂点の数だけ並べます。頂点の数がN個のとき、頂点には、座標を並べた順に0からN-1の番号が付けられます。

 coordIndexフィールドで面の構成を与えます。1つの面についてのその面を構成する頂点の番号(pointフィールドに並べた順)を面の表側から見て左回りに並べ最後に-1を付けます。例えば頂点番号0から5までで構成される5角形は 0 1 2 3 4 5 -1 と記述します。この組を面の数だけ並べます。

Color

 colorフィールドのColorノードで多面体の頂点または面の色を指定します。colorフィールドがNULLのときは、ShapeノードのappearenceフィールドのAppearenceノードで指定したものが面の外観になります。


Color { 
  exposedField MFColor color  []  
}

 colorフィールドには、RGBカラー値を頂点の数または面の数だけ並べます。

 colorPerVertexフィールドの値がTRUEのときは頂点の色、FALSEのときは面の色になります。
 colorIndexフィールドには、colorフィールドに並べた色がどの頂点または面に対応するかを頂点や面の番号で指定します。
 colorIndexフィールドの値がNULLのときは、colorフィールドに並べた色がpointフィールドで座標を指定した順番に頂点に付けられます。面の場合はcoordIndexフィールドで指定した面の順番に色が対応します。

IndexedLineSet

 IndexedLineSetは線を定義するノードで次の形式です。coordフィールドで点の座標を与え、coordIndexフィールドで線の構成を記述します。colorフィールドで点または線の色を指定します。ノードの記述の方法はIndexedFaceSetの説明の面を線と読みかえて下さい。ここでは説明を省略します。具体的な例は「shapeの例」を参照してください。


IndexedLineSet { 
  eventIn       MFInt32 set_colorIndex
  eventIn       MFInt32 set_coordIndex
  exposedField  SFNode  color             NULL
  exposedField  SFNode  coord             NULL
  field         MFInt32 colorIndex        []  
  field         SFBool  colorPerVertex    TRUE
  field         MFInt32 coordIndex        [] 
}

PointSet

 PointSetは点を作るノードで次の形式です。colorフィールド、coordフィールドはIndexedFaceSetおよびIndexedLineSetと同じです。


PointSet { 
  exposedField  SFNode  color      NULL
  exposedField  SFNode  coord      NULL
}

Extrusion

 ExtrusionはcrossSectionフィールドで与えられた平面の形を、spineフィールドで指定した線に沿って、scaleフィールドで指定した比率で押し出した形を作るノードです。次の形式をしています。具体例は「shapeの例」を参照してください。


Extrusion { 
  eventIn MFVec2f    set_crossSection
  eventIn MFRotation set_orientation
  eventIn MFVec2f    set_scale
  eventIn MFVec3f    set_spine
  field   SFBool     beginCap         TRUE
  field   SFBool     ccw              TRUE
  field   SFBool     convex           TRUE
  field   SFFloat    creaseAngle      0    
  field   MFVec2f    crossSection     [ 1 1, 1 -1, -1 -1,
                                       -1 1, 1  1 ] 
  field   SFBool     endCap           TRUE
  field   MFRotation orientation      0 0 1 0     
  field   MFVec2f    scale            1 1      
  field   SFBool     solid            TRUE
  field   MFVec3f    spine            [ 0 0 0, 0 1 0 ] 
}

 crossSectionフィールドは、y=0の平面(xz平面)上の面を指定します。2次元ベクトル値で面の構成する頂点のx,z座標を頂点の数+1個並べます。最初と最後は同じ座標になります。
 spineフィールドには、いくつかの点の座標を3次元ベクトル値で与えます。その点を結んだ折れ線に沿って、crossSectionフィールドで指定した面の形が押し出されます。
 scaleフィールドには、いくつかのx,z方向のスケールを与えます。spineフィールドに指定した点に対応してスケールが与えられます。spineフィールドに指定した点の数が多い場合はscaleフィールドの最後の値が繰り返されます。

ElevationGrid

 ElevationGridは地形を作るノードで次の形式です。地形はy=0の平面(xz平面)上に作成します。具体例は「shapeの例」を参照してください。


ElevationGrid { 
  eventIn      MFFloat  set_height
  exposedField SFNode   color             NULL
  exposedField SFNode   normal            NULL
  exposedField SFNode   texCoord          NULL
  field        MFFloat  height            []  
  field        SFBool   ccw               TRUE
  field        SFBool   colorPerVertex    TRUE
  field        SFFloat  creaseAngle       0    
  field        SFBool   normalPerVertex   TRUE
  field        SFBool   solid             TRUE
  field        SFInt32  xDimension        0   
  field        SFFloat  xSpacing          1.0 
  field        SFInt32  zDimension        0   
  field        SFFloat  zSpacing          1.0  
}

 xDimensionフィールドとzDimensionフィールドでx,z方向のグリッドの数を与えます。全体のグリッドの数はxDimensionフィールドの値(m) × zDimension(n)フィールドの値で、グリッドにはグリッド番号が0からm×n-1までふられます。
 xSpacingフィールドとzSpacingフィールドでグリッドの間隔を与えます。
 heightフィールドでは各グリッドのy方向の高さを実数値で与えます。



Appearance

 Appearanceノードは立体の外観を定義するものです。Appearanceノードには外観を色で表す materialフィールド、イメージファイルを貼り付ける textureフィールド、 イメージファイルの貼り付け方を指定する textureTransformlフィールドを指定できます。定義形式は次のとおりです。


Appearance { 
  exposedField SFNode material          NULL
  exposedField SFNode texture           NULL
  exposedField SFNode textureTransform  NULL
} 

 materialフィールドは Materialノードで構成されます。textureフィールドは、texture ノード(ImageTexture, MovieTexture, PixelTexture)で構成されます。textureTransformフィールドは、TextureTransformノードで構成されます。次にこれらのノードについて記します。



Material

 materialフィールドには Materialノードを記述します。Materialノードの定義形式は次のとおりです。


Material { 
  exposedField SFFloat ambientIntensity  0.2         
  exposedField SFColor diffuseColor      0.8 0.8 0.8 
  exposedField SFColor emissiveColor     0 0 0       
  exposedField SFFloat shininess         0.2         
  exposedField SFColor specularColor     0 0 0       
  exposedField SFFloat transparency      0           
} 

 Materialノードに指定するフィールドついて以下に記します。

diffuseColor
RGBカラー値を用いて色を設定します。R,G,Bの値を0〜1の実数値で指定します。
例 : diffuseColor 1 0.5 0.9
この色は光源と表面の角度の影響を受けます。
ambientIntensity
周囲の光の量を0〜1の実数値で設定します。
emissiveColor
立体が発光しているときの光の色をRGBカラー値を用いて設定します。
shininessとspecularColor
specularColorフィールドで立体のハイライト部分の色をRGBカラー値で設定し、shininessフィールドで光の鋭さを0〜1の実数値で指定します。値の小さい方が光がソフトで、値が1に近づくと光は鋭くハイライト部分は小さくなります。
transparency
立体の透明度を0〜1の実数値で指定します。値の大きい方が透明度が高くなり、1では見えなくなります。

Texture

 textureフィールドは、texture ノード(ImageTexture, MovieTexture, PixelTexture)で構成されます。ここではImageTextureノードについて説明し、MovieTextureノードとPixelTextureノードについては省略します。

ImageTexture

 ImageTextureノードは立体の外観として貼り付けるイメージファイルを設定します。


ImageTexture { 
  exposedField MFString url     []
  field        SFBool   repeatS TRUE
  field        SFBool   repeatT TRUE
} 

url
イメージファイルのURLを指定します。
例 : url "image.gif"
repeatSとrepeatT
平面の2方向にイメージの貼り付けを繰り返すかどうか指定します。TRUEは繰り返し、FALSEは繰り返しません。

 使用できるイメージファイルの形式は、JPEG と PNG です。ブラウザによっては CGM や GIF をサポートしています。

TextureTransform

 textureTransformフィールドは、TextureTransformノードで構成され、Textureの貼り付け方(位置や大きさ、方向)を設定します。


TextureTransform { 
  exposedField SFVec2f center      0 0 
  exposedField SFFloat rotation    0   
  exposedField SFVec2f scale       1 1 
  exposedField SFVec2f translation 0 0  
} 


centerとrotation
centerフィールドでtextureの回転の中心座標を指定し、rotationフィールドで回転の角度を指定します。回転は半時計回りです。
scale
texture座標系のscaleを 2次元ベクトル値でs方向とt方向について指定します。
translation
texture座標系の位置を2次元ベクトルで与えます。

 Texture座標の変換の順序を次に示します。指定のない場合は飛ばします。



Texture座標

 次に、Texture座標の変換ついて説明します。

 次の図の左側はtexture座標で、イメージファイルの横方向をs軸とし、s方向のイメージファイル一つ分の大きさを1とします。イメージファイルの縦方向をt軸とし、t方向のイメージファイル一つ分の大きさを1とします。  右側の図は座標変換をせずに面に貼り付けたときの面上の座標系を緑の軸で示しています。この座標の原点が面の左下に置かれ、面の横方向の大きさを1、縦方向の大きさを1にします。すなわち、イメージファイルは面の大きさに合わせて貼り付けられることになります。



 次の図は scale 2 2 と指定した場合です。texture座標のスケールの s、t方向ともに2倍の位置に、緑の座標系の1を合わせます。すなわち、イメージファイルは面上に縮小して貼り付けられることになります。



 次の図は translation 0.2 0.3 と指定した場合です。texture座標のs=0.2, t=0.3 の位置に、緑の座標系の原点を合わせます。すなわち、イメージファイルは面上で逆の方向に移動したように見えます。



 次の図は rotation 0.5 と指定した場合です。緑の座標系を半時計回りに30°回転します。すなわち、イメージファイルは面上で逆に時計回りに30°回転したように見えます。



 次の図は translation 0.2 0.3 と rotation 0.5 を指定した場合です。座標変換の順番に従って、まず、緑の座標系を半時計回りに30°回転します(破線)。次に s方向に 0.2, t方向に 0.3 移動します(実線)。



 次の図は center 0.8 0.0 と rotation 0.5 を指定した場合です。座標変換の順番に従って、まず、緑の座標系を s方向に -0.8, t方向に 0 移動します(破線)。次に緑の座標系を半時計回りに30°回転します(長破線)。次に s方向に 0.8, t方向に 0 移動します(実線)。



 ImageTextureノードのrepeatSフィールドやrepeatTフィールドがFALSEのときは、イメージファイルは繰り返し貼り付けられませんので、上の図に示したように1枚のイメージファイルから外れた部分は、表示されません。repeatSフィールドやrepeatTフィールドがTRUEのときは、面上にイメージファイルが繰り返し貼り付けられます。