Scenegraph/jp

FreeCADは基本的には様々なライブラリのコラージュです. なかでも最も重要なものはジオメトリーの管理と構築のためのOpenCascade、ジオメトリーを表示するためのCoin3d、そしてそれら全てを優れたグラフィカルユーザーインターフェースにまとめあげるQtです.

FreeCADの3Dビューに表示されるジオメトリーはCoin3Dライブラリによってレンダリングされています. Coin3DはOpenInventor規格の実装の一つです. OpenCascade自体にも同じ機能がありますがFreeCAD開発が始まった最初の段階でOpenCascadeに組み込まれたビューアーを使わず、より高性能なCoin3Dを使う、という決断がされました. このライブラリについて学ぶ早道はOpen Inventor Mentorを読むことです.

OpenInventorは実質的には3Dシーン記述言語です. OpenInventorで記述されたシーンはOpenGLによって画面にレンダリングされます. Coin3Dはこの部分の処理を行います. つまりプログラマーは複雑なOpenGLの呼び出しを扱うこと無く、正しいOpenInventorコードを入力するだけでいいのです. OpenInventorの大きな利点はとても広く知られ、またよくドキュメント化された規格であるということです.

FreeCADが行う大きな仕事の一つはOpenCascadeのジオメトリー情報をOpenInventor言語に翻訳することです.

OpenInventorでは3Dシーンを下記に示すようなシーングラフ形式で記述します：

Inventor mentorからの画像

OpenInventorのシーングラフではジオメトリー、色、マテリアル、ライトなど3Dシーンに含まれるものが全て記述され、それらすべてのデータが扱いやすい明快な構造体に整理されます. 全てのものをサブ構造体にグループ化することや、シーンの内容をかなり自由な形式で整理することも可能です. 以下はOpenInventorファイルのサンプルです：

Separator { RotationXYZ { axis Z       angle 0 }    Transform { translation 0 0 0.5 }    Separator { Material { diffuseColor 0.05 0.05 0.05 }       Transform { rotation 1 0 0 1.5708 scaleFactor 0.2 0.5 0.2 }       Cylinder { }    } }
 * 1) Inventor V2.0 ascii

見て分かる通り、構造体は非常にシンプルです. データをブロックにまとめるときにはセパレータを使います. ちょうどファイルをフォルダにまとめるのと似ています. 各命令文は以降の命令文に影響を与えます. 例えばサンプルのルートセパレータにある二つのアイテムは回転と移動ですが、この両方が次のアイテムであるセパレータに影響を与えます. そのセパレータ内ではマテリアルと別の変換が定義されています. 従って円筒（Cylinder）は両方の命令文の影響を受けます. 一つは直接適用され、もう一つは親セパレータに対して適用されます.

他にもグループ、スイッチ、注釈などシーンを作成するための多くの要素タイプが存在します. 色、テクスチャ、シェーディングモード、透過度を使って非常に複雑なマテリアルをオブジェクトに定義することが可能です. またライト、カメラ、あるいは動きさえ定義することができます. さらに複雑な振る舞いを定義するためにOpenInventorファイル内に短いスクリプトを埋め込むことさえ可能なのです.

もしOpenInventorをもっと学びたいと思ったら最も有名なリファレンスであるInventor mentorを見てください.

FreeCADでは通常はOpenInventorのシーングラフを直接操作する必要はありません. メッシュやパート形状などFreeCADドキュメント内のオブジェクトは全て自動的にOpenInventorコードに変換され、3Dビューに表示されるメインシーングラフに挿入されます. またあなたが変更を行ったり、ドキュメントにオブジェクトが追加/削除された際などシーングラフは途切れることなく更新され続けます. 実際の所、全ての（App空間内の）オブジェクトにはOpenInventorコード発行用の（Gui空間のオブジェクトに対応する）ビュープロバイダが備わっているのです.

しかしシーングラフに直接アクセスできると非常に便利です. 例えば一時的にオブジェクトの表示を変えたり、構築ジオメトリー、補助線、グラフィカルなヒント、あるいはマニピュレーターといったツールや画面上情報など実際にはFreeCADドキュメント内に存在しないオブジェクトをシーンに追加することができます.

FreeCAD自体にもOpenInventorコードを確認したり変更するためのツールがいくつか備わっています. 例えば以下のPythonコードを実行すると選択されているオブジェクトのOpenInventorでの表現を表示することができます.

obj = FreeCAD.ActiveDocument.ActiveObject viewprovider = obj.ViewObject print viewprovider.toString

またFreeCADのシーングラフなどCoin3Dによって管理されている全てのものに完全にアクセスするためのPythonモジュールもあります. 詳しくはPivyを読んでください.