OpenCASCADE で曲面を作成する

今回はいよいよ曲面を作成していきたいと思います。

平面までなら、なんとか独自に三次元幾何ライブラリーをこしらえて扱うことができるかもしれませんが、自由曲面を扱うシステムを組もうとすると、とても独自開発ではやっていけません。そんな時、OCCが力を発揮するわけです。

また、OCCではトポロジカルな扱いをする上で、平面と曲面の明確な差はあまりありません。 もちろん、作成時に必要となる要素は平面の方がより限定的ですが、トポロジーを考えた場合、平面も曲面の一部という考え方のほうがより自然です。

OCC上でトポロジカルな面(平面も曲面も)を扱うには、前回の平面の作成の際に出てきた面クラス TopoDS_Face を用います。

通過点を指定してベジエ曲面を作成する

uv方向にマス目状に並べた通過点を指定することで、曲面を作成します。一番、直感的で簡単な曲面の生成方法ですが、これは座標値の羅列から uv 曲線群を定義して面を生成しているので、内部的にはパラメトリックな曲面の式で構成されています。

コード

TColgp_Array2OfPnt poles(0, 3, 0, 3);
poles.SetValue(0, 0, gp_Pnt( 0,  0, 20));
poles.SetValue(0, 1, gp_Pnt( 0, 10, 20));
poles.SetValue(0, 2, gp_Pnt( 0, 20, 20));
poles.SetValue(0, 3, gp_Pnt( 0, 30, 20));
poles.SetValue(1, 0, gp_Pnt(10,  0, 10));
poles.SetValue(1, 1, gp_Pnt(10, 10, 10));
poles.SetValue(1, 2, gp_Pnt(10, 20,  5));
poles.SetValue(1, 3, gp_Pnt(10, 30,  0));
poles.SetValue(2, 0, gp_Pnt(20,  0,  0));
poles.SetValue(2, 1, gp_Pnt(20, 10,  5));
poles.SetValue(2, 2, gp_Pnt(20, 20, 10));
poles.SetValue(2, 3, gp_Pnt(20, 30, 10));
poles.SetValue(3, 0, gp_Pnt(30,  0, 20));
poles.SetValue(3, 1, gp_Pnt(30, 10, 20));
poles.SetValue(3, 2, gp_Pnt(30, 20, 20));
poles.SetValue(3, 3, gp_Pnt(30, 30, 20));

Handle(Geom_BezierSurface) s = new Geom_BezierSurface(poles);
TopoDS_Face f = BRepBuilderAPI_MakeFace(s, 1.0e-7);

TColgp_Array2OfPnt クラスは、gp_Pnt を2次元配列として保持するためのコレクションクラスです。 このコードを実行すると、次のような曲面が生成されます。

また、Geom_BezierSurface クラスのコンストラクタには、各通過点のウェイトを設定することも出来、次のようにコーディングすることができます。

// poles はあるものとする ...

// ウェイトの設定
TColStd_Array2OfReal weights(0, 3, 0, 3);
weights.SetValue(0, 0, 1.0);
weights.SetValue(0, 1, 1.0);
// ...

Handle(Geom_BezierSurface) s = new Geom_BezierSurface(poles, weights);
TopoDS_Face f = BRepBuilderAPI_MakeFace(s, 1.0e-7);

poles の u, v の各店に対応したウェイトを TColStd_Array2OfReal クラスで設定していき、コンストラクタに渡してあげます。

NURBS 曲面を作成する

ワイヤーをスイープ(掃引)して曲面を作成する

複数のワイヤーをロフトして曲面を作成する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください