基本立体としては,通常,直方体(立方体を含む),円柱,円錐,多角柱,多角錐, 球,トーラス,正多面体などがあります.これらの基本立体はそれぞれに寸法を決める パラメータが定義されます.例えば直方体では縦・横・高さの3つ,円柱では底面の 半径と高さの2つ,球では半径の1つ,といった具合です.こうしたパラメータを指定 して生成した形状を空間内の適切な位置に配置します.
3次元CADなどの形状モデラでは,こうした基本立体の間の集合演算(和,積,差)などを 行うことができて複雑な形状を作成することができますが,表示のみを対象とした ソフトウェアでは,基本的には立体の重ね合わせのみを行います.
基本立体で表現できない形状に関しては,次の面の集まりで表現することができます. ここでは面は辺が線分で構成される多角形(polygon)とします.多角形はそれを構成する 頂点の並びで表現できますので,多角形の表現は頂点の座標や,頂点の番号を順に記述 することが行われます.コンピュータグラフィックスの世界では,頂点の順番の向きは 面の表側からみたときの反時計回り(CCW)が使用されることが多いことは覚えておいた 方がよいでしょう.
X3Dで定義された世界をウェブブラウザで見るためには,専用のプラグインが 必要です.今回の演習で使用しているノートPCには
X3Dを体験する最もシンプルなプログラムを作成してみましょう. Windowsのメモ帳などのエディタを使って次を内容を含むファイルを 作成してみましょう.ファイル名はCone1.x3dです.
<?xml version = '1.0' encoding = 'EUC-JP'?>
<!DOCTYPE X3D PUBLIC 'ISO//Web3D//DTD X3D 3.0//EN'
'http://www.web3d.org/specifications/x3d-3.0.dtd'>
<X3D profile = 'Interchange' version = '3.0'>
<!-- Program Cone1.x3d: White Cone -->
<head> </head>
<Scene>
<Shape>
<Cone />
</Shape>
</Scene>
</X3D>
画面に三角錐(コーン)が表示されたと思います.(Cone1.x3d)
ファイルの中で実質的に対象を定義しているのは,< Cone / >の部分のみです.
X3Dの中で予め容易されている規定値(default)の底面形と高さで表示されています.
ただ,色も何もついていないので,次のような定義をしたファイルCone2.x3d
を作成してみます.ここでは,円錐の底面の半径と高さを指定し,さらに
Appearanceで見た目の色を指定しています.
<?xml version = '1.0' encoding = 'EUC-JP'?>
<!DOCTYPE X3D PUBLIC 'ISO//Web3D//DTD X3D 3.0//EN'
'http://www.web3d.org/specifications/x3d-3.0.dtd'>
<X3D profile = 'Interchange' version = '3.0'>
<!-- Program Cone1.x3d: White Cone -->
<head> </head>
<Scene>
<Shape>
<Cone bottomRadius = '3.0' height = '4.0'/>
<Appearance>
<Material diffuseColor = '0.0 1.0 0.0' />
</Appearance>
</Shape>
</Scene>
</X3D>
これで色が付きました.パラメータを色々と変えて形状と色がどのように変化するかを
確かめて見てください.(Cone2.x3d)
Flux Viewの中で,立体を回転させたり,拡大したりすることができます. Flux Viewの中で?を選択すると,操作マニュアルが表示されます.それを 参考に操作をしてみてください. また,円錐以外の形状も順に試してみましょう.
< Box size = '2.0 3.0 1.0'/>
< Sphere radius = '2.0'/>
< Cylinder radius = '2.0' height = '3.0'/>
さて,ここまでの内容では,複数の立体を並べて表示することができません.
そこで,2つの立体の表示する場所と姿勢を指定できるように拡張します.
<?xml version = '1.0' encoding = 'EUC-JP'?>
<!DOCTYPE X3D PUBLIC 'ISO//Web3D//DTD X3D 3.0//EN'
'http://www.web3d.org/specifications/x3d-3.0.dtd'>
<X3D profile = 'Interchange' version = '3.0'>
<!-- Program Cone1.x3d: White Cone -->
<head> </head>
<Scene>
<Transform translation = '-2.0 0.0 0.0'
rotation = '0.0 0.0 1.0 1.0'>
<Shape>
<Cone bottomRadius = '1.0' height = '2.0'/>
<Appearance>
<Material diffuseColor = '0.0 1.0 0.0' />
</Appearance>
</Shape>
</Transform>
<Transform translation = '1.0 0.0 0.0'
rotation = '1.0 1.0 0.0 1.0'>
<Shape>
<Box size = '1.0 1.0 1.0'/>
<Appearance>
<Material diffuseColor = '0.6 0.1 0.8' ' transparency = '0.5'/>
</Appearance>
</Shape>
</Transform>
</Scene>
</X3D>
これで傾いた2つの立体(円錐と立方体)が表示されたと思います.
(TwoObj.x3d)
Transformで囲われた内部に対する座標変換がtranslationとrotationの パラメータとして指定されています.rotationのはじめの3つは回転軸の x,y,z成分,4つめの数字はラジアンで指定される回転角です.
また,examineのモードで立体全体を回転させて,立方体が半透明になっている ことを確認してください.これは,Materialの中でtransparencyを指定したことで おこりました.0.0が不透明,1.0が完全な透明です.
X3D演習の終わりにもう少し複雑な例をあげておきましょう.
<?xml version = '1.0' encoding = 'EUC-JP'?>
<!DOCTYPE X3D PUBLIC 'ISO//Web3D//DTD X3D 3.0//EN'
'http://www.web3d.org/specifications/x3d-3.0.dtd'>
<X3D profile = 'Interchange' version = '3.0'>
<!-- Program Cone1.x3d: White Cone -->
<head> </head>
<Scene>
<Transform translation = '0.0 -1.0 0.0'
rotation = '1.0 0.0 0.0 -1.0'>
<Shape>
<IndexedFaceSet
colorPerVertex = 'FALSE'
coordIndex =
'0 3 2 1 -1
0 1 4 -1
0 4 3 -1
1 2 4 -1
2 3 4 -1'>
<Coordinate point =
'0.0 0.0 0.0
1.0 0.0 0.0
1.0 1.5 0.0
0.0 1.5 0.0
0.0 0.0 2.5'/>
<Color color =
'0.5 0.5 0.5
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
1.0 1.0 1.0'/>
</IndexedFaceSet>
</Shape>
</Transform>
</Scene>
</X3D>
ここでは多面体を頂点番号の並びで定義しています.
また,各面に対する色もRGBの指定で行っているのが
わかると思います.
<?xml version = '1.0' encoding = 'EUC-JP'?>
<!DOCTYPE X3D PUBLIC 'ISO//Web3D//DTD X3D 3.0//EN'
'http://www.web3d.org/specifications/x3d-3.0.dtd'>
<X3D profile = 'Interchange' version = '3.0'>
<!-- Program Cone1.x3d: White Cone -->
<head> </head>
<Scene>
<Transform translation = '0.0 -1.0 0.0'
rotation = '0.0 1.0 0.0 -0.5'>
<Shape>
<Appearance>
<Material diffuseColor = '0.6 0.9 0.8' />
</Appearance>
<Extrusion crossSection =
'1.0 0.0,
0.75 0.75,
0.0 1.0,
-0.5 0.0,
0.0 -0.5,
1.0 0.0'
spine ='0.0 0.0 0.0,
0.0 0.1 1.0,
0.0 0.4 2.0,
0.0 0.9 3.0' />
</Shape>
</Transform>
</Scene>
</X3D>
こちらは掃引体です.crossSectionで設定された断面をspinで定義された
軌跡で掃引して立体を作っています.