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

関連記事

UnityでTweenアニメーションを実装できる3種類の無料...

geometry3Sharp:Unity C#で使えるポリゴ...

Windows Server 2008にAutodesk M...

参考書

ZBrushでアマビエを作る その2

Human Generator:Blenderの人体生成アド...

ZBrushでアヴァン・ガメラを作ってみる 口内の微調整・身...

ZBrushでアヴァン・ガメラを作ってみる 甲羅の修正・脚の...

プログラムによる景観の自動生成

ZBrush キャラクター&クリーチャー

iPhoneアプリ開発 Xcode 5のお作法

機械学習で遊ぶ

ZBrush4新機能ハイライト 3DCG CAMP 2010

マルコフ連鎖モンテカルロ法

iPhone x ロボットハッカソン~RomoのiPhone...

3DCGのモデルを立体化するサービス

ZBrush 2021.6のMesh from Mask機能...

Google App Engine上のWordPressでF...

映画『ジュラシック・ワールド』のVFXメイキング

OpenMVS:Multi-View Stereoによる3次...

Maya API Reference

フリーのUV展開ツール Roadkill UV Tool

Maya LTでFBIK(Full Body IK)

Managing Software Requirements...

フルCGのウルトラマン!?

ZBrushの練習 手のモデリング

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

テスト

MFnDataとMFnAttribute

Quartus II

Siggraph Asia 2009 カンファレンスの詳細

Seleniumを使ったFXや株の自動取引

OpenCV

Mitsuba 3:オープンソースの研究向けレンダラ

『手を動かしながら学ぶエンジニアのためのデータサイエンス』ハ...

UnityプロジェクトをGitHubで管理する

Point Cloud Utils:Pythonで3D点群・...

Unityで画面タッチ・ジェスチャ入力を扱う無料Asset『...

Math Inspector:科学計算向けビジュアルプログラ...

チャットツール用bot開発フレームワーク『Hubot』

映画から想像するVR・AR時代のGUIデザイン

UnrealCLR:Unreal Engineで.NET C...

コメント