CGALDotNet:計算幾何学ライブラリ CGALのC#ラッパー

プログラムでポリゴンジオメトリを何かしら操作するなら、C++で利用できる計算幾何学ライブラリCGALが有名ですね。色々なアルゴリズムが実装されていて便利。

Unity C#環境で使える似たようなライブラリが無いかと探してみたら、そのものズバリC++のCGALをC#でラップしたCGALDotNetというライブラリがUnityのフォーラムで紹介されていた。

CGALDotNet



CGALはcomputational geometric algorithm library(計算幾何学アルゴリズムライブラリ)の略で、三角形化、ボロノイダイアグラム、ポリゴンと多面体のブール演算、ポイントセット処理、曲線の配置、サーフェスとボリュームメッシュの生成、ジオメトリ処理、アルファシェイプ、凸包アルゴリズム、形状の再構築など、様々なアルゴリズムを提供します。

計算幾何学アルゴリズムには、(浮動小数点などの)計算精度の問題に影響されて無効な結果を生成してしまうものも多くあります。CGALでは、計算精度を損なうことなく任意の数値を扱える正確な数値表現を提供することでこの問題を解決しています。この正確な数値表現は高度に最適化されていますが、パフォーマンスにはトレードオフがあります。正確な結果よりも処理速度が必要な場合、CGALは倍精度を使用した不正確な数値表現も提供しています。

CGALDotNetはC++で書かれたライブラリCGALのC#ラッパーであり、CGALへの手軽なアクセスを提供しますが、いくつか制限があります。CGALDotNetは、ポイント、ベクトル、ボックス、円など、CGALにデータを渡すための様々な幾何学的構造体を提供しています。これらのC#構造体は倍精度に制限されているため、CGALとのデータ受け渡しの際に精度が損なわれる可能性があります。

以下は正確な数値表現でポリゴンを作成する例です。

//create some points.
var points = new Point2d[count];

//create a polygon using the exact predicates exact construction kernel.
var polygon = new Polygon2<EEK>();

//set the polygons points.
polygon.SetPoints(points);

以下は不正確な数値表現でポリゴンを作成する例です。

//create some points.
var points = new Point2d[count];

//create a polygon using the exact predicates inexact construction kernel.
var polygon = new Polygon2<EIK>();

//set the polygons points.
polygon.SetPoints(points);

この正確な計算(exact computation)のパラダイムについては、CGALのページのを参照してください。

CGALDotNetはまだ開発途上で、現在は64ビットのWindows向けバイナリしか提供されていないらしい。
ジオメトリオブジェクトのCGALDotNetGeometryなど、関連するリソースがいくつか別リポジトリで管理されているようだ。



別プロジェクトのCGALDotNetUnityにUnityで利用する場合のサンプルがあり、Unityのデータ形式とCGALDotNetのデータ形式を相互に変換するための拡張メソッドが提供されている↓

Unity Extensions

CGALDotNetは他のプロジェクトから独立するように設計されていますが、C#で記述されているのでそのままUnityと併用できます。

CGALDotNetUnityプロジェクトには、UnityのオブジェクトとCGALDotNetのオブジェクト間の変換を支援する拡張メソッドが用意されています。

以下に例を示します。

//These extension methods need the numeric namespace.
using CGALDotNetGeometry.Numerics;

//Create a CGALDotNet point.
var point1 = new Point3d();

//Convert it to a unity vector.
var vector = point1.ToUnityVector3();

//And back to a CGALDotNet point.
var point2 = point1.ToCGALPoint3();

ポイントやベクトルの配列、レイやボックスなどの形状にも似たメソッドが用意されています。
ポリゴンをGameObjectに変換するメソッドもあります。

//These extension methods need the polygon namespace.
using CGALDotNetGeometry.Polygons;

//Create a polygon.
var polygon = new Polygon2(points);

//Convert polygon to a game object with a triangulated mesh of the polygon.
//Polygon points are 2D and will be converted to 3D for the mesh.
var mesh = polygon.ToUnityMesh("polygon", position, material);

ちょっと触ってみたところ、CGAL側で作成したポリゴンをUnityのGameObjectとして表示するのは楽だけど、UnityのGameObjectからCGALへポリゴンを持って行く方法はあまり整備されてないみたい。

関連記事

写真から3Dメッシュの生成・編集ができる無料ツール『Auto...

オープンソースの顔の動作解析ツールキット『OpenFace』

ジュラシック・パークのメイキング

Kornia:微分可能なコンピュータービジョンライブラリ

C++始めようと思うんだ

OpenCVで顔のモーフィングを実装する

UnityでLight Shaftを表現する

映画『シン・仮面ライダー』 メイキング情報まとめ

ラクガキの立体化 モールドの追加

DUSt3R:3Dコンピュータービジョンの基盤モデル

Mayaのプラグイン開発

ラクガキの立体化 胴体の追加

TVML (TV program Making langua...

WordPress on Windows Azure

書籍『ゼロから作るDeep Learning』で自分なりに学...

ポリゴン用各種イテレータと関数セット

単純に遊びに行くのはだめなのか?

WebGL開発に関する情報が充実してきている

アニゴジ関連情報

FCN (Fully Convolutional Netwo...

Raspberry Pi 2のGPIOピン配置

Raspberry PiのGPIOを操作するPythonライ...

色んな三面図があるサイト

トランスフォーマーの変形パターンを覚えるのは楽しいと思うんだ

SIGGRAPH ASIAのマスコット

Pix2Pix:CGANによる画像変換

2012 昨日のクローズアップ現代を見た

Google Earth用の建物を簡単に作れるツール Goo...

Iterator

この本読むよ

Web経由でRaspberry PiのGPIOを操作したい

Unityからkonashiをコントロールする

TensorFlowでCGを微分できる『TensorFlow...

ZBrushでゴジラ2001を作ってみる 頭の概形作り

ラクガキの立体化 目標設定

Google App Engine上のWordPressでF...

Blender 2.81でIntel Open Image ...

ブログの復旧が難航してた話

ZBrushの練習 手のモデリング

ZBrushで作った3Dモデルを立体視で確認できるVRアプリ...

機械学習に役立つPythonライブラリ一覧

ZBrushで仮面ライダー3号を造る 仮面編 DynaMes...

コメント