[Houdini] Vellum Constraints を読んでみた その4
概要
こちらの続きです
環境
OS: Windows 10
Houdini: 19.0.622
Redshift: redshift_v3.0.62 (たぶん)
読んでいく
Tetrahedral Volume
ドキュメントより
各四面体を、その四面体の体積を維持する拘束に変換します。
Note これは、シアー(傾斜)またはストレッチ(伸縮)の拘束を含んでいません。 適切なソフトボディを作成するには、さらにDistance拘束を追加する必要があります。
__stretchsrc
かつ __constraintsrc
な point が属する prim が
下記を満たす時、四面体を追加します
- 四面体(Tetrahedron)である
- 4頂点で構成されている
- ↑の頂点が全て
__constraintsrc
に属する
追加した四面体のprimに対して、下記を設定します
- __stretchconstraints (group)
- restlength (四面体の体積) * Rest Length Scale (Stretch の Rest Length Scale の値)
- type (ここでは
tetvolume
) - Stiffness (Stretch の Stiffiness の値)
- Damping Ratio (Stretch の Damping Ratio の値)
四面体の体積を求める computeTetVolumeRestLength
について、
補足図を用意しました
参考
Attach To Geometry
ドキュメントより
指定したポイントが3番目の入力のジオメトリに取り付けられます。 これらのポイントには、 Attach Frame での最近接ポイント番号が格納され、それらを結び付けるDistance拘束を作成します。
やや段階が多いですが、バリエーション対応のためです
create_target_constraints
ノード
__stretchsrc
な point に sphere を追加し諸々設定します
共通設定はこれです
- restvector (それぞれで得られる targetpos)
Use Closest Location on Primitive / Constrain to Closest Point が共に有効なとき
xyzdist で今見てる point から一番近い primitive を取得します
見つかれば、下記を設定します
- target_prim (xyzdist からもらった 一番近い prim)
- target_uv ( ↑と同じタイミングで取得したuv情報)
Constrain to Closest Point のみ有効のとき or 共に無効のとき
- Constrain to Closest Point が有効 : nearpoint で一番近い point を取得
- 共に無効 : Attachするジオメトリの
__attachsrc
な point の中から、
対応する index の point を見つけようとする
見つかれば、下記を設定します
- target_pt (nearpoint で見つけた一番近い point)
- dist (今見てる point と targetpos との距離)
set_target_attribs
ノード
これらを primitive に設定します
- type (ここでは attach)
- targetpath (指定されていればそれで、なかったらCollisionのジオメトリパスをつくる)
- stiffness (Stretch の Stiffiness の値)
- damping Ratio (Stretch の Damping Ratio の値)
- restlength * restscale (Stretch の Rest Scale をかける)
velocity blend が有効なとき
Velocity Blend が ScaledByAttribute ときに指定した Attribute で scaling します
accumScaleValues で難しそうに見えますが、Promotion Method が Average なら
そのまま掛け算されるだけです
Tangent Stiffness が有効なとき
元のGeometryのprimが3点以上からなるポリゴンのとき、
type: attachnormal として さらに sphere を追加します
ほぼ値引き継ぎですが、一部異なります
- restlength : 0 (Restlength is always zero to constraint directly to line to closest point.)
- restvector : attachする Geometry 上にある頂点座標
- restdir : 前段で生成した sphere の position から restvector へ向けての vector を @target_prim 上に射影したもの
- stiffness (Tangent Stiffiness の値 * 10n)
- damping Ratio (Stretch の Damping Ratio の値)
restdir
Sliding Rate が有効なとき
prim に attribute を追加します
- Sliding Rate
- Target Group
Scale by Attribute のときは下記も追加します
- Sliding Attribute
- Promotion Method
Tips
Xform とは
Transformation の意だそうです (知らなかった)
Enumerate
Group内 index を作れたりするべんりなやつ
xyzdist
ポイントからサーフェスジオメトリ上の一番近い位置までの距離を調べます。 originから、指定したジオメトリ上の指定したプリミティブグループ内の一番近い位置までの距離を調べて、その一番近い位置におけるプリミティブ番号とUV座標を出力引数に書き出します。
vex にて @
から始まる変数
string @target_path = "";
のような書き方をたまに見かけます
特に深い意味はないのかな... と思っていたら、
下記のようなコードを見つけ混乱しました
string @target_path = ""; int @target_prim = -1; vector @target_uv = 0; ... vector orig = primuv(t@argetpath, "P", @target_prim, @target_uv);
Houdini での用語や名前が分からないですが、どうやら
すでに attribute として設定されていたらその値を、なければ右辺で初期化
という用途のようです
少し書き下すとこんな感じです
prim に target_path
というattribute があったりなかったりする例を想定しています
string target_path = ""; if (hasattrib(0, "primitive", "target_path")) { target_path = prim(0, "target_path", @primnum); }
まとめ
少しずつ数学が出てきてまた勉強し直さなきゃ...という感じになってきました
この本が手元にあるので、読んだりしようと思います
実例で学ぶゲーム3D数学 | Fletcher Dunn, Ian Parberry, 松田 晃一 |本 | 通販 | Amazon
何かあれば Twitter までお気軽にどうぞ~ twitter.com