基本立体としては,通常,直方体(立方体を含む),円柱,円錐,多角柱,多角錐, 球,トーラス,正多面体などがあります.これらの基本立体はそれぞれに寸法を決める パラメータが定義されます.例えば直方体では縦・横・高さの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で定義された 軌跡で掃引して立体を作っています.