てんちょーの技術日誌

自分がつまづいたこととかメモ

[Houdini] Vellum Constraints を読んでみた その4

概要

こちらの続きです

shop-0761.hatenablog.com

環境

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 について、
補足図を用意しました

参考

examist.jp

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 を作れたりするべんりなやつ

www.sidefx.com

xyzdist

ポイントからサーフェスジオメトリ上の一番近い位置までの距離を調べます。 originから、指定したジオメトリ上の指定したプリミティブグループ内の一番近い位置までの距離を調べて、その一番近い位置におけるプリミティブ番号とUV座標を出力引数に書き出します。

www.sidefx.com

support.borndigital.co.jp

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