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では複数の方法でサブディビジョンサーフェイスが利用できるようになっていますのでワークフローに応じて使い分けていただけると良いかと思います。

2025年1月9日木曜日

OpenSubdiv キット

 ピクサーが公開しているオープンソースであるOpenSubdivを使用したModoのポリゴン分割のコマンドとメッシュモディファイアのプラグインをgithubにリリースいたしました。今回はLinux版のバイナリーもキットの中に入っています。macOS版はユニバーサルバイナリですので、IntelとARMの両方で動作します。

このプラグインではOpenSubdivが提供するサブディビジョンスキームとオプションをそのままModoのポリゴン再分割に利用することを目的としています。Catmull-Clarkの他、三角形ポリゴンを分割するためのLoopスキームも対応しています。

Modoには標準のポリゴン分割コマンドやモディファイアが初期のバージョンから実装されていますが、互換性や独自機能の保持のため、OpenSubdivの分割方法と若干ことなる結果となる場合があります。また、このプラグインではサーフェイスポリゴンのみを再分割するため、カーブやポリラインは分割できません。Modoのサブディビジョンサーフェスに関しては、また別の記事で解説したいと思います。

下記はLoopスキームを使って再分割を行った例です。Loopは三角形を再分割するスキームですので、四角形以上のポリゴンは一度三角形に分割してからOpenSubdivの機能を使って分割しています。三角形分割は標準のGenerateTriangleメソッドを使って行っていますので、ソースケージの三角形の形をコントロールしたい場合は、事前に三角形分割してからこのプラグインを使用することをお勧めいたします。Bilinearは、標準のポリゴン分割コマンドのFacetedと同じです。


OpenSubdivでは、UVなどのポリゴンコーナに属するデータをFace-varyとして補間する機能があります。このキットのv1.0では、Modoの頂点マップに保存されているUVデータのみを補間しています。将来的なバージョンでは、UV以外の頂点カラーなどの頂点マップなどの補間やGPUを使用した高速化などを計画しています。


2024年12月25日水曜日

CDT Triangulation キット v1.1

 CDT Triangulation キットv1.1に更新いたしました。主な変更はバグフィックスですが、テスト的にQuad Ruleというオプションもつけてみました。CDTのアルゴリズムは、穴の空いた複数のループを考慮して高い品質の三角形が生成できますが、入力するループに捩れによる交差などがあるとエラーが起こってしまいます。このキットリリース後にDiscordなどでクラッシュバグの報告があったため調べたところ下記のように捩れて線分同士が交差するポリゴンだとクラッシュしてしまうことが判明しました。

対応策として、入力ポリゴンのループが自己交差している場合には、CDTは使用せずにModo標準の三角形分割アルゴリズムを使用することでクラッシュを回避するように変更いたしました。Modo標準の三角形分割は、ILxPolygonクラスのGenerateTrianglesメソッドで提供されていますが、今回はlxu_geometry_triangulation.hppにあるlx::TriangulateFaceを使用しています。こちらの方が標準のポリゴン三角形分割に近い実装です(いつの間に誰が公開しちゃったんでしょう。気が付かなかったです)。GenerateTrianglesは、いわゆるEarClippingアルゴリズムで高速ですが品質はあまり良くありません。

また、ポリゴンが凸包の四角形の場合は、単純に対角線上にポリゴンを分割すれば良いので高速化のために別に処理をするように変更しました。せっかくなので分割する対角線の方向を指定するオプションも追加しておきました。ただし、これは分割する全てのポリゴンに対して適用されるため、まだあまり実用的ではないかもしれません。左右対称に分割されるような処理などが必要そうです。これは今後の課題にしたいと思います。このキットに関してなにかバグや要望がございましたらGithubのIssuesに投稿をお願いいたします。

今回のポリゴンのコーナーが捩れて交差してしまうのは、ポリゴンベベルなどでポリゴンのループをインセットした時、このような捩れができてしまうのがそもそもの原因です。これはまた、別の機会に捩れのないポリゴンインセットができるようなプラグインの開発に挑戦してみたいと思います。

2024年12月17日火曜日

Laplacian Smoothing キット

 Laplacian SmoothingキットをGithubで公開しました。Laplacian Smoothingは、データ平滑化のアルゴリズムの手法で、主に形状データの局所的なノイズを抑え、滑らかな形状にする特徴があります。頂点の位置を、その点に隣接する点の平均位置に向かって少しずつ移動させることで、表面を平滑化します。

Laplacian Smoothingのプラグインを作るにあたり、オープンソースのジオメトリ処理ライブラリのlibiglを使用いたしました。libiglは、シンプルかつ高機能なオープンソースのC++ジオメトリ処理ライブラリで、ヘッダーをインクルードしてプロジェクトをビルドすることができます。今回使用したLaplacian以外にもModoの機能に組み込んだら面白そうな興味深い機能がたくさんあります。今回はlibiglを使ったプラグインを利用して作るプロジェクトの練習のつもりで作りました。Pythonから利用可能なライブラリも用意されているようです。多くの計算処理をEigenを使って行っていますのでEigenの使い方さえマスターできれば簡単に利用できそうです。

Modoの標準のスムースツールは、汎用的でかつマルチタスキングを使って高速化されていますので、多くの場面では標準のスムースツールを使用することができます。今回のLaplacian Smoothingを使うと局所的なディテールが徐々に平滑化したい場合などで有効な方法だと思います。下記はLaplacian SmoothingのStrengthを0.0, 1.0, 2.0に変えてスムージングを行った例です。足先のディテールが徐々になくなっていきます。

 Stength = 0.0
 Strength = 1.0
 Strength = 2.0

下記はModoのスムージングの例です。全体的に一様に平滑化されていますが足先のディテールはそのまま残っています。


このライブラリのLaplacianを使って気がついたのは、平滑化の処理を対して行うと全体に形状がシュリンクしてしまうことです。このプラグインではオリジナルの形状の境界ボックを保存し、平滑した結果がその境界ボックスにフィットするようにスケールを掛けています。形状の表面積に基づいてスケールファクターを求めるなどの考え方もあります。この辺りは実用性を考えながら改善の余地がありそうです。

また、この計算処理は一度のスムージング処理で平滑化が大きく変化するという特徴もあります。上記のStrengthは、実際には平滑化処理を0回、1回、2回掛けた結果です。中間的な調整がやり難いのでこのプラグインでは、処理回数をStrengthとして浮動小数点数に変更し、処理回数の中間値を線型補完するようにしています。Modoのフォールオフにも対応しています。








2024年12月10日火曜日

CDT Triangulation キット

 標準の三角形分割の機能よりも品質の良い三角形を生成するCDT TriangulationキットをGitHubにリリースしました。以前からModoのアルファテスターの方々からModoの三角形分割のアルゴリズムを改善してほしいとの要望がありました。将来リリース予定のModoで実装する準備をしていたのですが、開発が中止になりましたので、オープンソースのライブラリを利用してModoのプラグインの形式で作り直すことにいたしました。コマンド版とメッシュオペレータ形式の2つがキットに含まれています。

今回実装した三角形分割は、制約付きドロネー三角形分割(Constraint Delaunary Triangulation)というアルゴリズムを使っています。 制約付きドロネー三角形分割は、ドロネー三角形分割に元のポリゴンエッジを必ず使用するという制約を付加したもので、多くのアプリケーションで広く使われています。

CDT三角形分割を実現するModoのプラグインを実装するにあたり、今回はartem-ogreさんが、Githubで公開しているCDTのオープンソースライブラリを利用させていただきました。このライブラリの実装はとても堅牢で、外ループに加えて、穴を表現する内ループも任意に追加することができるので便利です。

Modoの場合、鍵穴ポリゴン(Keyhole Polygon)と読んでいるちょっとイレギュラーなポリゴンを許容しているので、これを外ループと内ループに分解してCDTに三角形分割させることができました。鍵穴ポリゴンは、外ループと内ループを繋ぐ双方向のブリッジエッジを持つポリゴンで、四角形をそれよりも小さい四角形を使って軸ドリルをすると内と外を繋ぐエッジを持った穴の空いたポリゴンができます。これが鍵穴ポリゴンで、穴のあるテキスト文字をフリーズした時に生成されます。たとえば「虫」という文字をフリーズすると双方向のエッジが二つ追加された一筆書きの一つのポリゴンが生成されます。ポリゴンの頂点リストに同じ頂点が複数存在するポリゴンなので、Modoのモデリングツールはこのような特殊なポリゴンもサポートする必要があるので注意が必要です。他の3DCGアプリケーションでは、エラーになりそうな気がしますので、他のファイル形式に出力する際には三角形分割などして対応した方が良さそうです。

下記はModoの標準の三角形分割コマンドで上記のポリゴンを分割した結果(上)とCDTで分割した結果(下)の比較です。明らかにCDTで生成した三角形の方が正三角形に近いきれいな三角形が生成されています。



あるユーザーさんから、CDT以外にも有限要素法などで使われているポリゴンの内部に頂点を追加し、内部に三角形を密集するタイプの適応型ドロネー三角形分割もサポートできないかというリクエストをいただきました。これはまた今後の研究で考えてみたいと思います。


2024年12月1日日曜日

Blender LXO Importer

ModoとBlenderを組み合わせて使用するワークフローをよく耳にするようになりました。ModoとBlenderとのシーンデータのやり取りで便利そうなBlenderのアドオンがDiscordのModoチャンネルで話題になっています。 

rockjailさんのio_scene_lxoは、ModoのLXOシーンファイルをBlenderから直接読み込むためのアドオンで、githubにてフリーで公開されています。rockjailさんは、元々LXOファイルを読み込むためのパーサーをPythonプログラムとして公開されていたようで、io_scene_lxoはこのパーサーを利用して作成されているようです。

まだ、開発中(EXPERIMENTAL)とのことですが、下記のようなデータをBlenderに読み込むことができるようです。

  • メッシュデータ(UVマップ、マテリアルタグをサポート)
  • カメラ
  • ライト (スポット, エリア, 指向性, 点光源)
  • ロケータのトランスフォーム
  • その他ロケータタイプのアイテム
  • アイテムの親子構造
  • 座標系に関するオプション


インストールはio_scene_lxoのCodeプルダウンメニューからDownload.zipを選択してディスクに保存。このZIPファイルはそのままBlenderのアドオンファイルとしてインストールできますので、BlenderのPreferenceからAdd-onsの右上にあるInstall from Disk...からダウンロードしたZIPファイルを選択すれば完了です。BlenderのFileメニューのImportからModo Object (*.lxo)が選択できるようになっているはずです。


試しにUVマップを持つ、サブディビジョンサーフェイスモデルを読み込んでみました。サブディビジョンサーフェイスは、Subsurfモディファイヤーとして読み込まれています。EyeとFaceのUVマップも正しく読み込まれているようです。


次に親子関係の階層構造を持つ、モデルを読み込んでみました。ModoのContentに含まれているRobodog-Anim.lxoを読み込んでみました。Robodogの階層構造は再現されているようですが、シーンのZ軸がY軸と入れ替わっているようです。ImportのForwardとUpオプションを変更してみましたが、Pythonのエラーが表示されたため、これはうまく修正できませんでした。



まだ、少し制限があるようですが、ModoでモデリングとUV編集をしたモデルをBlenderに読み込むワークフローであれば、便利に使えそうです。






2024年11月30日土曜日

Scene Converter

11月28日にリリースされたModo 17.1を最後に、20年続いたModoの開発が終了いたしました。非常に残念ですが、Modo 17.1が最終リリースとなります。このような状況になり、長い間Modoを使ってくださっているユーザーのみなさまには、大変申し訳なく思っております。Foundry社からはこの先10年使用可能なノードロックライセンスが配布されてますので、まだまだ使用していただくことができます。

ModoのLXO形式で保存したシーンファイルを他のファイル形式に一括して変換できないだろうかという要望がMJGさん経由でありましたので、ハードディスクに保存したシーンファイルを他の形式に一括して変換するPythonスクリプト(SceneConverter)を作ってみました。

このPythonスクリプトは、Modoのコマンドとして実装しており、あるフォルダ(Source Folder)の下層フォルダにある指定した形式のシーンファイルを保存先フォルダ(Destination Folder)に同じ階層構造で指定したシーンファイル形式で保存します。変換したシーンファイルのリストをログテキストとして保存したり、元のシーンが参照している画像ファイルを保存先フォルダにコピーするオプションがあります。変換時のエラーはModoのイベントログとこのログテキストにも出力しています。

なお、このスクリプトはPython3で記述していますので、Modo 16.0以前のバージョンを使用されている方は、初期設定パネルのPythonのバージョンをPython3に設定する必要があります。Pythonスクリプトですので自由に改変して使っていただけると思います。変換形式は、Modo、FBX、Alembic、COLLADA、USD、LWOが選択可能ですが、Modoでサポートされている他の形式も追加することができます。

MJGさんのブログでも使い方を詳しく紹介していただいていますので、ご興味のある方はそちらもご覧ください。