2025年3月31日月曜日

Parameterize キット

Parameterizationのアルゴリズムを比較する研究目的でParameterizeキットを作ってみました。Parameterizationは、3次元空間のメッシュを2次元空間にマッピングするためのアルゴリズムの呼称で、3DCGツールではUV展開の手法として使用されています。Modoでは初期のバージョンからLSCM(Least Square Comformal Maps)やABF++などのアルゴリズムがUV UnwrapツールやUV Relaxツールとして実装していましたが、その後はあまりアップデートしていませんでした。

CDT TriangulationキットやSkeletonキットを作った際に、CGALやlibiglがさまざまなParameterizationの機能を提供していたので、Modoで試してみれるようにプラグインにしてみました。自分の研究目的で作ったキットですので、Modoの機能としてはあまり実用的ではないかもしれません。すみません。

境界を固定化したパラメータ化

これは3DCGのUVツールでは、あまり利用されることはないと思いますが、円もしくは四角形などの固定された境界の中に3次元空間のメッシュをマッピングするアルゴリズムです。計算方法は、Tutte Barycentric Mapping、Floater Mean Value Coordinates、Discrete Conformal Map、Discrete Authalic Parameterizationなどがあり、展開するポリゴンの角度比率の歪みを最小限にしたり、面積比率を最小化するなど各アルゴリズムで特徴があります。


LSCM(Least Square Comformal Maps)

おそらくUV Unwrapのアルゴリズムとして、最も一般的に使われている手法ではないかと思われます。角度の歪みの最小化は、コーシーリーマン方程式の最小二乗近似に基づいており、角度の歪みや非一様なスケーリングを最小化します。計算には少なくとも2つの頂点を固定しておく必要があります。初期の頃に公開された比較的ベーシックなアルゴリズですが、計算が比較的安定しているので、多少イレギュラーなメッシュであっても安定して計算結果をえることができるのが良いです。Least Squares Conformal Maps for Automatic Texture Atlas Generationという論文がもとになっています。Modoでは、ユーザーが手動で計算の反復回数を指定するようにしていますが、CGALでは収束するまで自動的に計算を反復するようです。



ARAP (As Rigid As Possible Parameterization)

As Rigid As Possible (ARAP) パラメータ化は、3D形状を2D平面に展開する際に、形状の局所的な変形の少なさを最大限に保つことを目的とした手法です。剛性の維持を実現するために、局所的な回転や移動を許容する代わりにスケールの歪みを最小にします。エネルギー関数を定義し、その最小化を通じて形状の変形を非線形で計算するため、LSCMに比べて計算コストが大きいようです。剛性の維持を優先したいUV展開では良い結果を得ることができそうですが、計算量が多くちょっと遅いです。



SLIM (Scalable Locally Injective Maps)

SLIM(Scalable Locally Injective Maps)は、メッシュパラメータ化や変形において局所的な単射性(local injectivity)を維持しながら、歪みを最小化するアルゴリズムです。計算結果で得られた三角形がすべて正しい方向に向くように保持されるのが特徴です。計算効率も良く等角度と等長の歪みバランスをよく保持してくれる点が優れています。BlenderのUV UnwrapにもMinimum Stretchのモードで実装されています。このキットではlibiglが提供するSLIMの機能をEigenを使って計算しているのですが、UVの初期値の三角形がフリップしていたり、重なったりしていると計算がなぜか失敗してしまいます。Blenderではプロダクションレベルで使用されているようなので、私の実装の方法がまだどこかおかしいのかもしれません。






2025年2月23日日曜日

Straight Skeleton キット その2

Straight Skeletonキットをv1.0.1に更新しました。主な変更はクラッシュバグの修正とExtrudeモードでMaximum Heightでクリップされたトップポリゴンの三角形をできるだけマージするように変更しました。Extrudeモードで作成する形状は基本的に三角形で出力されるので同一平面上の三角形はできるだけまとめておいた方が使いやすそうです。

また、実験的にですが要望があったInsetモードをBETA版として追加してみました。これはStraight Skeletonの出力結果を使って、可能な限り交差の少ないポリゴンのインセットを行うことを目的としています。アイディアとしては、Extrudeで作成されたメッシュの元の輪郭上の頂点から、分岐されたエッジを高い方向かつ距離が短い方向にエッジをMaximum Heightの高さまで辿っていくことで輪郭の頂点とスケルトンを構成する頂点を結ぶベクトルを求めようとする試みです。ただし、この方法だとExtrudeした形状のピークが複数ある場合、低い方のピークに辿り着いた検索エッジがより高いピークを探してしまうため、何かしらの方法で検索をストップさせる条件を見つける必要があります。また、新しくインセットで作られたポリゴンのUVは保管されていないので、これも正しく実装する必要があります。Modoのポリゴンベベルでは3Dポリゴンのインセットの情報をもとにUVポリゴンもUV空間で一つ一つインセットを行うという結構めんどくさいことをしていました。良いアイディアが見つかりましたら、Insetモードの残りの問題にチャレンジしてみたいと思います。




2025年2月13日木曜日

Straight Skeleton キット

 Straight Skeleton キットを公開いたしました。Straight Skeletonは、2Dポリゴンの中心線カーブを求めるアルゴリズムで、等高線の作成や3次元地形モデル、建築物の屋根のモデリングなどで利用されています。外郭を構成する線分を等速で移動させ、それらが衝突などで発生したイベントごとにトポロジーを更新していくアルゴリズムです。

前回、CDT三角形分割で利用したCGALにStraight Skeletonライブラリがありましたので、これを利用してModoのプラグインを作ってみました。CGALのStraight Skeletonライブラリは機能が豊富でしたのでこのプラグインでは、実験的に複数のモードを用意し、異なる結果が得られるようにしてみました。もっと便利な使い方はこれから研究してみたいと思います。

Skeletonモード

これはポリゴンの背骨となる中心線(Straight Skeleton)を求め、ポリゴンの外郭を構成する頂点とで作られる複数の平面にポリゴンを分割します。



アップロード中: 127810 / 127810 バイトをアップロードしました。



Extrudeモード

これはポリゴンの輪郭線をStraight-Skeletonの押し出し機能を利用して立体的な押し出し形状を生成します。押し出しはゴールとなる中心線の高さとなり、Maximum Heightを指定することで中間の高さまで押し出しを制限することができます。中心線の高さは固定されていますので、Scaleを使って高さを調整できるようにしました。


Duplicateモード

Duplicateはポリゴンの輪郭線をStraight-Skeletonの中心線の内側もしくは外側に向かってオフセットしたポリゴンを作成する機能です。オフセットした形状は複数のループに分割されたり、交差部分が融合する場合があります。段階的にオフセットしたポリゴンが一度に得られるように、ShiftオプションとStepsオプションを追加しています。


Offsetモード

OffsetはDuplicateと同じ方法でもとのポリゴンのオフセットループを求めていますが、新しくポリゴンを作る代わりに、元のポリゴンの各頂点の座標値を最も近い位置にあるオフセットループの頂点座標値に移動しています。これによりコーナー部分に交差のないインセットを行うことができます。Mergeオプションをオンにしておけば、同一点に収束された頂点はマージされます。この方法は元の頂点とオフセットループの頂点の距離を使ってインセットを行っていますので、オフセットループのトポロジーが極端に変更された場合などでは、インセットされたループは破綻する場合があるので注意が必要です。



2025年2月4日火曜日

Part Falloff

 FoundryでModoの開発をしていたChris Hagueが自身のGithubでPart Falloffというサブツールを公開しています。ChrisはLuxologyからFoundryへ来たデベロッパーの一人でModoのアーキテクチャに関するスペシャリストです。Modo17.0のマルチスレッドを使った新しいModoのアーキテクチャをデザインしたのもChrisで、Modoの内部構造に関しては一番詳しいのではないかと思います。

Part Falloffは、リニアフォールオフに似たフォールオフサブツールです。リニアフォールオフがフォールオフ影響範囲にある頂点の座標値に対してウェイトを頂点ごとに線形に設定するのに対して、Part Falloffは、連結されたポリゴンのグループの中心を評価し、グループ単位にフォールオフウェイトが設定されます。いままでありそうでなかったフォールオフサブツールで便利そうですね。



Modoにはツールパイプラインというアーキテクチャがあり、フォールオフ、アクションセンター、アクションアクシスなどが独立したツールとして実装されていて、他のメインツールと組み合わせて使用することができます。プラグインであとからPart Falloffなどのサブツールが追加されると組み合わせでどんどん面白そうなコンビネーションツールが増えていきます。

ChrisのGithubには、Part Falloffのリポジトリにはソースコードのみが公開されています。このツールを使用するには、ターゲットとするOS向けに自分でソースコードをビルドするか、DiscordのPixel Fondueのサーバーの#modo-contentからPartFalloff.lpkをダウンロードする方法があります。


2025年1月24日金曜日

MODOトレーニングブック

 ディストームさんのオンラインストアで澤田 覚志さん著のMODOトレーニングブックが発売されています。MODOの機能を紹介するチュートリアルビデオはいくつもありますが、日本語の書籍は貴重です。かなりの大作ですよ。

内容はMODOの基本操作から始まり、マイクや小物のモデリング、キャラクターモデリングをいろいろなモデリングチップスを交えながら解説されています。澤田さんは、YAMATOWORKSさんのプロジェクトを中心に数多くの作品に3Dモデリングディレクター、CGIディレクターとして参加されているバリバリ第一線のクリエータさんなので、このトレーニングブックで解説されているチップスは単にMODOの操作手順でなく、他のDCCツールでも使えるプロフェッショナルのテクニックだと思います。

後半は前半で作ったキャラクターをもとにライティング、レンダリング、アニメーションが丁寧に解説されています。レンダーパスやコンポジットの解説は、アニメの制作過程のチップスが盛り込まれているので読みごたえがありました。

また、付録にはMODOのモデリングの基本アーキテクチャとなっているアクションセンター、フォールオフ、スナッピングなどが解説されています。これらはMODOのモデリングワークフローを理解するうえで重要な考え方なので、これらをちゃんと理解するとグッとモデリング作業が快適になります。トラブルシューティングのチップスも貴重ですね。

MODOをこれから使ってみたいと思われている方の入門書として、アニメ制作のプロフェッショナルのチップスを勉強するための学習書として貴重な一冊になっていると思います。



2025年1月21日火曜日

CDT Triangulation キット v2.0

 CDT Triangulation キットを大幅に更新いたしました。最初のバージョンをリリースした際に、Conforming Delaunay TriangulationでFEMなどで使用するような最適化された三角形を生成するようにできないかとのリクエストがあり、これに対応するため最初のバージョンで使用していたCDTライブラリをCGALに変更いたしました。CGAL(Computational Geometry Algorithms Library)は、幾何計算分野における歴史のあるライブラリで多くの優秀な幾何計算アルゴリズを利用することができます。オープンソースで利用する場合は、GPL、LGPLライセンスに基づいて利用することができます。ModoはCGALの商用ライセンスは取得していなかったので、今回初めて個人のオープンソースプロジェクトで利用させていただきました。

Constraint Delaunay Triangulationに関しては、最初のバージョンと処理結果は変わりません。元のポリゴンのエッジを拘束条件として、元の頂点のみを使用して三角形分割の処理を行います。

Conforming Delaunay Triangulationのために新たに追加したのは、三角形の最長エッジサイズ(Minimum Edge Size)と最小角度(Maximum Angle)です。最長エッジサイズは、分割した三角形のエッジのサイズを規制するもので、このサイズが短いほど細かな三角形が生成されます。CGALのライブラリでは絶対的な長さを設定するのですが、このキットでは元のポリゴンのサイズに対する相対的なサイズでも指定することができるようにしています。これにより元のポリゴンの大きさが変わっても同じ分割を維持することができます。最小角度は、生成する三角形のコーナーの角度を指定するものです。理想的な角度は正三角形の60°ですが、ここではデフォルトを20.7°としています。いろいろ試してみたのですがこの値を大きくし過ぎるとハングしてしまうことがあったため、上限を30°にしています。三角形の密度は最長エッジサイズを主としてコントロールしたほうが良さそうです。



その他、v2.0では分割した新しい三角形とそのエッジと頂点をSelect By Previous Operationで利用できるように変更いたしました。

CGALには、他にも素晴らしいアルゴリズムが数多く公開されています。このライブラリを使って、もっといろいろなプロジェクトにチャレンジしてみたいと思います。

2025年1月15日水曜日

Modoのサブディビジョンサーフェイスについて

OpenSubdivキットをバージョンアップし、UVマップ以外のRGBマップなどの不連続頂点マップとモーフポジションの補間を行うようにしました。またメッシュモディファイアは、再分割したメッシュエレメントをエレメントグループに設定するように変更し、Select By Previous Operationから選択できるようにいたしました。

Modoでは、このOpenSubdivキットとは別にOpenSubdivをサポートしていたり、ネイティブのサブディビジョンサーフェイスもオリジナルのサブディビジョンサーフェイスとCatmull-Clarkサブディビジョンサーフェイスの2つがあるので、今回はModoサブディビジョンサーフェイスの取り扱いについて解説したいと思います。


ポリゴンタイプとしてのサブディビジョンサーフェイス

このOpenSubdivキットのメッシュモディファイアのように、多くのDCCアプリケーションではサブディジョンサーフェイスをモディファイアとして実装されていることが多いです。ModoのサブディビジョンサーフェイスはFACEポリゴンなどと同列のポリゴンタイプとして実装されています。これにより同一メッシュ内で異なるタイプのポリゴンタイプをミックスして扱うことができる自由度があります。選択したFACEポリゴンをTABキーを押すことによって同一メッシュの部分的なポリゴンをサブディビジョンサーフェイスとして扱うことができます。ポリゴンタイプはModoのコアレベルで実装されています。


オリジナルのサブディビジョンサーフェイスとCatmull-Clarkサブディビジョンサーフェイス

Modoのオリジナルのサブディビジョンサーフェスポリゴンタイプ(以下SUBD)は、Stuart Fergusonによって実装されたもので、Catmull-Clarkのアルゴリズムとパラメトリック曲面を組み合わせたハイブリッドなオリジナルのアルゴリズムを使用しています。特徴はとにかく軽量でメモリー消費も少ない優れた曲面です。負のエッジウェイトを扱える点もユニークです。欠点はウェイトを使用した場合、UVに歪みが生じてしまうのと、ほかのDCCアプリケーションでも標準となっていたピクサーのCatmull-Clarkサブディビジョンサーフェイスとの互換性が取れなかったことにあります。その後、もう一つのサブディビジョンサーフェイスのポリゴンタイプとして、ピクサーのCatmull-Clarkサブディビジョンサーフェイス(以下PSUB)を実装しました。実装当時はOpenSubdivはまだリリースされていなかったので、Subdivision Surface in Animation に基づいて一から実装いたしました。打ち合わせのためピクサーアニメーションスタジオに訪問したことを覚えています。


オリジナルのサブディビジョンサーフェイス(左からウェイト0%、100%、−100%)


OpenSubdivアイテムプラグイン

その後、OpenSubdivがリリースされましたので、ModoもOpenSubdivに対応してほしいとの要望があったのですが、PSUBはマルチレゾリューションスカルプティングなどにも対応していたため、PSUBの実装をOpenSubdivと置き換えることはできませんでした。また、Modoのコアモジュールに直接サードパーティのライブラリをリンクすることができないという制約も足かせになりました。そこで考えたのがサブディジョンサーフェイスの頂点位置データを外部プラグイン経由でOpenSubdivに計算させる方法です。OpenSubdivアイテムプラグインはModoのFACEポリゴンを読み込んで補間計算を行い、計算結果をPSUBの頂点位置情報に戻しています。ちょっとトリッキーですが、OpenSubdivを補間計算を行う計算エンジンとして使用しています。ただ、あくまでもPSUBポリゴンタイプの拡張機能として作られたプラグインですので、OpenSubdivがサポートしている様々なオプションはほとんど利用されていません。



OpenSubdivキット

今回のOpenSubdivキットは、ポリゴンタイプとは異なるアプローチでOpenSubdivの機能をModoで使用することを目的で開発しました。PSUBポリゴンタイプとは関係なくメッシュモディファイアとして実装しているのでCatmull-Clark以外のスキームやOpenSubdivが提供するUV補間方法のオプションなどもそのまま使うことができます。他のDCCアプリケーションと同様の方法ですね。Modoでは複数の方法でサブディビジョンサーフェイスが利用できるようになっていますのでワークフローに応じて使い分けていただけると良いかと思います。