Meshes & deformation

Sweep / Extrusion

スイープ・押し出し

断面を経路に沿って運び配管や触手を作る。

5 / 10

Interactive demo

Preparing the demo…

Sweep / Extrusion

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

円や星形などの断面の形を、曲線に沿って運びながら並べ、隣り合う断面どうしを面でつないで立体を作る方法です。まっすぐ押し出せば柱に、曲線に沿って運べば配管やホースに、先へ行くほど小さくすれば触手や角になります。大事なのは、各点で断面をどちらに向けるか(フレーム)の決め方です。

ゲームでの使いどころ

  • 配管・ケーブル・ロープ:レベルの中を這う配管やケーブルを、制御点を置くだけで作る。
  • 道路・線路・川:道路の断面(路面と縁石)をスプラインに沿って運び、起伏のある道を作る。線路の枕木は、曲線に沿って一定間隔に並べる。
  • 触手・つる・しっぽ:うねる曲線に先細りの断面を運び、動きに合わせて毎フレーム作り直す。
  • 剣の軌跡・リボン:断面を線分(幅だけ)にすると、剣を振った跡やリボン状の軌跡になる。

しくみ

曲線を C(t)\mathbf{C}(t)、断面の点を (x,y)(x, y) とします。各点で、接線 T\mathbf{T} と、それに直交する 2 つの向き(法線 N\mathbf{N} と従法線 B\mathbf{B})からなる枠(フレーム)を決め、

P(t,x,y)=C(t)+s(t) (x B(t)+y N(t))\mathbf{P}(t, x, y) = \mathbf{C}(t) + s(t)\,\big(x\,\mathbf{B}(t) + y\,\mathbf{N}(t)\big)

の位置に断面の点を置きます。s(t)s(t) は太さ(先細り)です。問題は N\mathbf{N} の決め方です。

  • フレネ標構:曲線の曲がる向き(接線の変化 T′\mathbf{T}')を N\mathbf{N} にします。数学的にはきれいですが、まっすぐな所では向きが決まらず、曲がる向きが左右で入れ替わる所では N\mathbf{N} が急に反転し、断面がくるっとねじれます。
  • 回転最小化フレーム(RMF):最初の枠を決めたら、次の点へはなるべく回さずに運びます。二重反射法(Wang ほか 2008)では、区間の両端を 2 回の鏡映で結ぶだけで、軸の周りのねじれがほとんどない枠が安く求まります。

実装のポイント

  • 弧長で並べる:断面を曲線のパラメータ tt で等間隔に置くと、曲線の場所によって間隔がばらつきます。弧長パラメータ化で距離が等しくなるように並べます。
  • 閉じた曲線のねじれ:輪になった曲線を RMF で一周すると、最後の枠が最初とずれることがあります。ずれの角度を全体に少しずつ割り振って打ち消します。
  • UV 座標:曲線方向の uu は弧長、断面方向の vv は断面の周長にすると、テクスチャが伸びずに貼れます。道路では uu を繰り返して路面の模様を並べます。
  • ねじりの演出:RMF で安定させたうえで、わざとねじり角を足すと、ドリルやねじれたロープのような形になります。

つまずきやすい点

  • 急なカーブでの自己交差:曲線の曲がり半径が断面の半径より小さいと、内側で面が交差して裏返ります。曲線をなだらかにするか、太さを抑えます。
  • フレームの反転:フレネ標構を使うと、S 字の曲線で断面がひっくり返ります。ほとんどの場合、RMF を使うのが正解です。
  • 分割数と負荷:毎フレーム作り直す触手などでは、分割数が多すぎると重くなります。GPU で頂点を動かす(断面の位置をシェーダーで計算する)方法もあります。

デモで試すこと

  1. 「うねる触手」で、星形の断面が先細りしながら曲線に沿って運ばれます。緑と赤の短い線が各点の断面の向きです。
  2. 「断面の向きの決め方」をフレネ標構にすると、曲がる向きが変わる所で緑の線が急に向きを変え、星形の角の並びがねじれます。回転最小化フレームに戻すと、ねじれが消えます。
  3. 「配管」「道路」に切り替えると、断面と曲線を変えるだけで、まったく違う物が作れることがわかります。
  4. 「ねじり」を動かすと、わざとねじった形(ドリルやロープ)になります。

References

libigl Tutorial ↗

A general reference for this subcategory.