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

関連記事

CGレンダラ研究開発のためのフレームワーク『Lightmet...

OpenCV 3.1から追加されたSfMモジュール

Raspberry PiでIoTごっこ

中学3年生が制作した短編映像作品『2045』

ZBrushでリメッシュとディティールの転送

GAN (Generative Adversarial Ne...

ZBrushで基本となるブラシ

Google App EngineでWordPress

Kubric:機械学習用アノテーション付き動画生成パイプライ...

Autodesk CompositeとAutodesk Ma...

Python拡張モジュールのWindows用インストーラー配...

ZBrushのUndo Historyをカメラ固定で動画化す...

Google Chromecast

ZBrushでアヴァン・ガメラを作ってみる 頭頂部の作り込み...

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

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

Open Shading Language (OSL)

ニンテンドー3DSのGPU PICA200

OpenGVの用語

プログラミングスキルとは何か?

手を動かしながら学ぶデータマイニング

書籍『3次元コンピュータビジョン計算ハンドブック』を購入

MFnDataとMFnAttribute

UnityのMonoBehaviourクラスをシングルトン化...

ZBrushでゴジラ2001を作ってみる 身体のアタリを作る

なんかすごいサイト

シン・ゴジラのファンアート

オープンソースのテクスチャマッピングシステム『Ptex』

布地のシワの法則性

アニゴジ関連情報

UnityのGlobal Illumination

動的なメモリの扱い

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

ZBrushでアヴァン・ガメラを作ってみる 下半身のバランス...

ZBrushでアヴァン・ガメラを作ってみる 全体のバランス調...

ヒーローに変身なりきりアーケードゲーム『ナレルンダー』

Blender 2.8がついに正式リリース!

OpenVDB:3Dボリュームデータ処理ライブラリ

UnityからROSを利用できる『ROS#』

HerokuでMEAN stack

ZBrushCoreのTransposeとGizmo 3D

BlenderのRigifyでリギング

コメント