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

関連記事

リアルタイム レイトレーシングAPI『DirectX Raytracing (DXR)』

ZBrushでアヴァン・ガメラを作ってみる 甲羅のバランス調整

海外ドラマのChromaKey

ZBrushトレーニング

OpenCV 3.3.0-RCでsfmモジュールをビルド

MythTV:Linuxでテレビの視聴・録画ができるオープンソースプロジェクト

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

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

Pylearn2:ディープラーニングに対応したPythonの機械学習ライブラリ

Mechanizeで要認証Webサイトをスクレイピング

WordPressプラグインによるサイトマップの自動生成

OpenFace:Deep Neural Networkによる顔の個人識別フレームワーク

Unite 2014の動画

ゴジラ(2014)のメイキング

組み込み向けのWindows OS 『Windows Embedded』

ZBrushでアヴァン・ガメラを作ってみる 脚のポーズ調整

機械学習手法『Random Forest』

konashiのサンプルコードを動かしてみた

Pythonのソースコードに特化した検索エンジン『Nullege』

ZBrushで仮面ライダー3号を造る 仮面編 失敗のリカバー

WordPressのサーバ引っ越し方法を考える

Ambient Occlusionを解析的に求める

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

ラクガキの立体化 反省

布のモデリング

頭蓋骨からの顔復元と進化過程の可視化

ブログが1日ダウンしてました

WordPressのテーマを自作する

なんかすごいサイト

素敵なパーティクル

Polyscope:3Dデータ操作用GUIライブラリ

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

Geogram:C++の3D幾何アルゴリズムライブラリ

Mixamo:人型3Dキャラクターアニメーション制作サービス

Twitter APIのPythonラッパー『python-twitter』

DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵...

Regard3D:オープンソースのStructure from Motionツール

Adobe Photoshop CS4 Extendedの3Dモデル編集機能

BlenderのRigifyでリギング

MLDemos:機械学習について理解するための可視化ツール

2012のメイキングまとめ(途中)

線画を遠近法で描く

コメント