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へポリゴンを持って行く方法はあまり整備されてないみたい。


スポンサーリンク

関連記事

フリーで使えるスカルプト系モデリングツール『Sculptris 』
Deep Learningとその他の機械学習手法の性能比較
IronPythonを使ってUnity上でPythonのコードを実行する
畳み込みニューラルネットワーク (CNN: Convolutional Neural Network...
OpenCV3.3.0でsfmモジュールのビルドに成功!
株式会社ヘキサドライブの研究室ページ
映像ビジネスの未来
Theia:オープンソースのStructure from Motionライブラリ
書籍『The Art of Mystical Beasts』を購入
3D映画のポストプロダクション 2D-3D変換
WebGL開発に関する情報が充実してきている
ちょっと凝り過ぎなWebキャンペーン:全日本バーベイタム選手権 (MITSUBISHI KAGAKU...
ZBrushでアヴァン・ガメラを作ってみる モールドの彫り込み・身体の形出し
布地のシワの法則性
openMVGをWindows10 Visual Studio 2015環境でビルドする
DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵...
Raspberry Pi 2を買いました
AndroidもopenGLも初心者さ (でもJavaは知ってるよ)
Maya LTでFBIK(Full Body IK)
ラクガキの立体化 背中の作り込み・手首の移植
iOSデバイスと接続して連携するガジェットの開発方法
Unite 2017 Tokyoに行ってきた
オープンソースのネットワーク可視化ソフトウェアプラットフォーム『Cytoscape』
1枚の画像からマテリアルを作成できる無料ツール『Materialize』
WordPressプラグインの作り方
ZBrushでゴジラ2001を作ってみる 頭の概形作り
書籍『メイキング・オブ・ピクサー 創造力をつくった人々』を読んだ
この本読むよ
Autodesk CompositeとAutodesk MatchMoverが無料
オープンソースのロボットアプリケーションフレームワーク『ROS (Robot Operating S...
ZScript
ZBrushでアヴァン・ガメラを作ってみる 全体のバランス調整
Paul Debevec
BlenderのPython環境にPyTorchをインストールする
Python拡張モジュールのWindows用インストーラー配布サイト
ZBrushでゴジラ2001を作ってみる 身体のSubToolを分割
『ローグ・ワン/スター・ウォーズ・ストーリー』のVFXブレイクダウン まとめ
Google App Engineのデプロイ失敗
JavaScriptとかWebGLとかCanvasとか
参考になりそうなサイト
PythonでMayaのShapeノードプラグインを作る
ZBrush4新機能ハイライト 3DCG CAMP 2010

コメント