可視化の二つの側面
OpenCASCADEの可視化システムは以下の二つの主要な側面を持っています:
- 表示と選択のための幾何学的・位相的データの格納
- プレゼンテーション:シーン内でオブジェクトを表示する際の視覚的表現
- 選択:インタラクティブにオブジェクト全体または部分を選択し、アプリケーション定義の操作を適用する機能
AIS(Application Interactive Services)はこれらの機能を提供する主要なコンポーネントです。
基本概念
プレゼンテーションの分離
プレゼンテーションサービスは、アプリケーションアルゴリズムによって生成されるデータから分離されています。この分離により、可視化サービスを変更することなく、幾何学的または位相的アルゴリズムとその結果オブジェクトを修正することが可能になります。
プレゼンテーションの構成要素
画面上でのオブジェクト表示には以下の三つのエンティティが関与します:
- 表示可能なオブジェクト(AIS_InteractiveObject)
- ビューア
- インタラクティブコンテキスト(AIS_InteractiveContext)
表示可能オブジェクト
Graphic3d_Structureはオブジェクトのグラフィカル表現を提供し、適切なアルゴリズムを呼び出し、表示のためのフレームワークを保持します。最初の表示リクエスト時に、この構造を作成します。
標準的な表現アルゴリズムはStdPrsおよびPrs3dパッケージで提供されています。
プレゼンテーションパッケージ
プレゼンテーションには少なくともAIS、PrsMgr、StdPrs、V3dパッケージが関与します。独自の表現アルゴリズムを実装する場合は、Prs3dやGraphic3dなどの追加パッケージを使用できます。
標準インタラクティブオブジェクト
- AISパッケージ:インタラクティブオブジェクトの実装クラス
- PrsDimパッケージ:寸法と関係の描画用オブジェクト
- MeshVSパッケージ:メッシュデータ処理用のMeshVS_Meshオブジェクト
標準プレゼンテーションビルダー
- Prs3dパッケージ:矢印、円柱、球体などの単純な幾何学形状の標準アルゴリズム
- StdPrsパッケージ:B-Rep形状の標準表現アルゴリズム
- DsgPrsパッケージ:寸法、関係、XYZ三面体の表示ツール
低レベルインターフェース
- PrsMgrパッケージ:表示可能オブジェクトの基本インターフェース
- Graphic3dパッケージ:低レベルグラフィック構造とOpenGLなどの接続
3Dプレゼンテーション
3D用語集
- グループ:プリミティブと属性の集合
- 光源:環境光、ヘッドライト、指向性、位置、スポットの5種類
- プリミティブ:描画可能な要素(線、面、テキスト、マーカー)
- 構造:グループの管理と階層形成
- Zバッファリング:シェーディングモードでの隠面消去
グラフィックプリミティブ
Graphic3dパッケージは3Dビューアでのグラフィックオブジェクト作成を担当します。構造は以下のプリミティブで構成されます:
- 線分、三角形、テキスト、マーカー
- 色、透明度、反射、線種、線幅、テキストフォントなどの属性
構造階層
親構造の属性は子構造に継承されますが、逆方向の影響はありません。再帰的な構造ネットワークはサポートされていません。
プリミティブの種類
- マーカー:サイズ、形状、方向が変換に依存しない
- 三角形分割:頂点法線、スタイル、色、マテリアル属性
- ポリライン:スタイル、幅、色属性
- テキスト:幾何的・非幾何的属性を持つ
プリミティブ配列
各種プリミティブは以下の配列タイプで表現できます:
- Graphic3d_ArrayOfPoints
- Graphic3d_ArrayOfPolylines
- Graphic3d_ArrayOfSegments
- Graphic3d_ArrayOfTriangleFans
- Graphic3d_ArrayOfTriangles
- Graphic3d_ArrayOfTriangleStrips
点配列の定義例:
// 配列の作成
Handle(Graphic3d_ArrayOfPoints) pointArray = new Graphic3d_ArrayOfPoints(maxVertexCount);
// 頂点の追加
pointArray->AddVertex(15.0, 15.0, 15.0);
pointArray->AddVertex(5.0, 15.0, 15.0);
// 構造への配列追加
Handle(Graphic3d_Group) primGroup = presentation->NewGroup();
primGroup->AddPrimitiveArray(pointArray);
primGroup->SetGroupPrimitivesAspect(drawer->PointAspect()->Aspect());
三角形配列の定義例:
// 配列の作成
Handle(Graphic3d_ArrayOfTriangles) triArray = new Graphic3d_ArrayOfTriangles(
vertexCount, edgeCount, Graphic3d_ArrayFlags_None);
// 頂点の追加
triArray->AddVertex(-2.0, 1.0, 1.0); // 頂点1
triArray->AddVertex(2.0, 1.0, 1.0); // 頂点2
triArray->AddVertex(1.0, 2.0, 1.0); // 頂点3
triArray->AddVertex(1.0, -2.0, 1.0); // 頂点4
// 辺の定義
triArray->AddEdges(1, 2, 3); // 最初の三角形
triArray->AddEdges(1, 2, 4); // 第二の三角形
// 構造への追加
Handle(Graphic3d_Group) geomGroup = presentation->NewGroup();
geomGroup->AddPrimitiveArray(triArray);
geomGroup->SetGroupPrimitivesAspect(drawer->ShadingAspect()->Aspect());
テキストプリミティブ
TKOpenGlツールキットはテクスチャフォントを使用してテキストラベルをレンダリングします。Graphic3dテキストプリミティブの特徴:
- 固定サイズまたはスケーラブル
- ビュープレーン内での回転サポート
- Unicode文字セットのサポート
テキストの追加例:
// グループの取得
Handle(Graphic3d_Group) textGroup = presentation->NewGroup();
// テキスト属性の設定
Handle(Graphic3d_AspectText3d) textAttr = new Graphic3d_AspectText3d();
textAttr->SetTextZoomable(true);
textAttr->SetTextAngle(30.0);
textGroup->SetPrimitivesAspect(textAttr);
// テキストプリミティブの追加
Handle(Graphic3d_Text) labelText = new Graphic3d_Text(18.0f);
labelText->SetText("ラベルテキスト");
labelText->SetPosition(gp_Pnt(2, 2, 2));
textGroup->AddText(labelText);
完全な表示設定例:
// 表示接続の作成
Handle(Aspect_DisplayConnection) displayConn = new Aspect_DisplayConnection();
// グラフィックドライバの作成
Handle(OpenGl_GraphicDriver) graphicsDriver = new OpenGl_GraphicDriver(displayConn);
// ビューアの作成
Handle(V3d_Viewer) mainViewer = new V3d_Viewer(graphicsDriver);
mainViewer->SetDefaultBackgroundColor(Quantity_NOC_DARKBLUE);
// 構造の作成
Handle(Graphic3d_Structure) mainStruct = new Graphic3d_Structure(
mainViewer->StructureManager());
mainStruct->SetVisual(Graphic3d_TOS_SHADING);
// プリミティブグループの作成
Handle(Graphic3d_Group) geometryGroup = mainStruct->NewGroup();
// 四角形の作成
Handle(Graphic3d_ArrayOfTriangleStrips) quadStrips =
new Graphic3d_ArrayOfTriangleStrips(4);
quadStrips->AddVertex(-80.0, -80.0, 0.0);
quadStrips->AddVertex(-80.0, 80.0, 0.0);
quadStrips->AddVertex(80.0, -80.0, 0.0);
quadStrips->AddVertex(80.0, 80.0, 0.0);
// 表示属性の設定
Handle(Graphic3d_AspectFillArea3d) fillAspect =
new Graphic3d_AspectFillArea3d(Aspect_IS_SOLID, Quantity_NOC_BLUE,
Quantity_NOC_BLUE, Aspect_TOL_SOLID, 1.0f,
Graphic3d_NameOfMaterial_Plastic,
Graphic3d_NameOfMaterial_Plastic);
geometryGroup->SetGroupPrimitivesAspect(fillAspect);
geometryGroup->AddPrimitiveArray(quadStrips);
// 照明の設定
Handle(V3d_AmbientLight) ambientLight = new V3d_AmbientLight(Quantity_NOC_GRAY60);
Handle(V3d_DirectionalLight) directLight =
new V3d_DirectionalLight(V3d_Zneg, Quantity_NOC_WHITE, true);
mainViewer->AddLight(ambientLight);
mainViewer->AddLight(directLight);
mainViewer->SetLightOn();
// ウィンドウの作成
Handle(Xw_Window) displayWindow = new Xw_Window(displayConn,
"3D表示テスト", 150, 150, 600, 600);
displayWindow->Map();
// ビューの作成
Handle(V3d_View) mainView = new V3d_View(mainViewer);
mainView->Camera()->SetProjectionType(Graphic3d_Camera::Projection_Perspective);
mainView->SetWindow(displayWindow);
mainStruct->Display();
mainView->Update();
mainView->FitAll();