メッシュ生成・変形

サブディビジョンサーフェス

Subdivision Surface

面を細分して丸みのある形にする。

7 / 10

インタラクティブデモ

デモを準備しています…

サブディビジョンサーフェス

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

少ない面でできた角ばった形(制御メッシュ)の面を細かく分けながら、新しい点を周りの点の重み付き平均の位置に置くことをくり返して、なめらかな曲面を作る方法です。四角形を基本にするカトマル・クラーク法が最も広く使われ、ピクサーの映画やほとんどのモデリングツールの「サブディビジョン」はこれです。少ない点を動かすだけで、なめらかな形を思いどおりに作れます。

ゲームでの使いどころ

  • モデリング:キャラクターや乗り物を、ローポリの制御メッシュで形を決めてから、細分割してなめらかにする。ゲームには細分割した結果(あるいは簡略化したもの)を書き出す。
  • 実行時の細分割:近いときだけ細かく分けて、遠いときは制御メッシュのまま描く。GPU のテッセレーションやメッシュシェーダーで行う。
  • とがった辺の指定:カップの縁や機械の角のように、残したい辺を「クリース(とがった辺)」として指定すれば、丸める所と残す所を使い分けられる。
  • 手続き的な形:押し出しで作った角ばった形を細分割するだけで、生き物のような有機的な形になる。

しくみ

カトマル・クラーク法の 1 回の細分割では、次の 3 種類の点を作ります。

  1. 面点:各面の頂点の平均。
  2. 辺点:辺の両端の点と、その辺をはさむ 2 つの面点の平均。
E=v0+v1+F0+F14E = \frac{\mathbf{v}_0 + \mathbf{v}_1 + F_0 + F_1}{4}
  1. 新しい頂点:元の頂点 PP を、周りの面点の平均 QQ と、周りの辺の中点の平均 RR を使って動かします(nn はつながる辺の数)。
P′=Q+2R+(n−3)PnP' = \frac{Q + 2R + (n - 3)P}{n}

各面を「頂点・辺点・面点・辺点」の四角形に分けるので、1 回で面の数は(四角形なら)4 倍になります。くり返すと、制御メッシュの内側に収まる、なめらかな曲面(3 次の B スプライン曲面の一般化)に近づきます。

とがった辺では、辺点を単なる中点にし、辺の上の頂点は隣の 2 点とだけ 18(Pa+6P+Pb)\frac{1}{8}(P_a + 6P + P_b) で混ぜます。こうするとその辺に沿った方向だけなめらかになり、角が残ります。

実装のポイント

  • 辺と面のつながりを持つ:各辺をはさむ面、各頂点を囲む面と辺を調べる必要があるので、半辺(ハーフエッジ)構造や、辺 → 面の対応表を用意しておきます。
  • 四角形で作る:三角形が混ざっても動きますが、四角形中心の制御メッシュの方が、きれいな曲面になります。三角形だけのメッシュには Loop 法を使います。
  • 回数は 2〜3 回:1 回ごとに面が 4 倍になるので、3 回で 64 倍です。ゲームでは必要な所だけ細かくするか、結果を簡略化してから使います。
  • 異常点:つながる辺の数が 4 でない頂点(異常点)の周りは、曲面のなめらかさが少し落ちます。制御メッシュをなるべく「どの頂点も辺 4 本」になるように作ります。

つまずきやすい点

  • 縮んで見える:細分割した曲面は制御メッシュより内側に来るので、思ったより小さく丸くなります。角を残したい所は、辺を足すかクリースを使います。
  • UV のゆがみ:テクスチャ座標も一緒に細分割しないと、テクスチャがずれます。UV の境界は、形とは別にとがった辺として扱うのが一般的です。
  • 制御メッシュの流れ:面の並び(トポロジー)が悪いと、細分割したときにしわやゆがみが出ます。関節の周りなどは、曲がる方向に沿った面の流れにします。

デモで試すこと

  1. 「腕を押し出した形」は、白い線の角ばった制御メッシュから、細分割の回数を増やすと生き物のような丸い形になります。回数ごとに面の数が 4 倍になることを確かめてください。
  2. 「新しい点の置き方」を「分けるだけ」にすると、面が増えても形は角ばったまま変わりません。丸くなるのは、点を平均の位置へ動かしているからです。
  3. 「立方体」は、細分割すると球に近い形になります。
  4. 「カップ」では、縁と底の辺がとがった辺として指定されています。「とがった辺を使う」を切ると、縁まで丸くなってしまいます。

参考資料

libigl Tutorial ↗

分野全体の資料で、この項目を直接扱っているとは限りません。