てんちょーの技術日誌

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

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

概要

こちらの続きです

shop-0761.hatenablog.com

環境

OS: Windows 10
Houdini: 19.0.622
Redshift: redshift_v3.0.62 (たぶん)

一部下記で確認しています
Geforce Game Ready ドライバー 526.47
Houdini 19.0.796 (daily)

Vellum Open CL Error on new install | Forums | SideFX

読んでいく

hair

ドキュメントより

エッジ上の距離とエッジ間の屈曲で構成された拘束を生成します。 この屈曲には、エッジの捻じれも含まれるので、Torsion(ねじり力)効果を出すことができます。

参考

www.sidefx.com


add_stretch_shear_constraints

__stretchsrc を対象に

  • 対象の point が 1つの prim にのみ属している
  • ポリゴンである
  • ポリゴンが開いている (閉じていない)

を満たす point を見つけます
その point と隣接する point を結ぶ polyline を追加し下記を設定します

  • __stretchconstraints (group)
  • restlength (polyline の長さ) * Rest Angle Scale (Stretch の Rest Length Scale の値)
  • type (ここでは stretchshear)
  • stiffness (Stretch の Stiffiness の値)
  • damping Ratio (Stretch の Damping Ratio の値)

add_bend_twist_constraints

__bendsrc を対象に point と隣接する point を結ぶ polyline を追加し下記を設定します

  • __bendconstraints (group)
  • restvector * Rest Length Scale (Bend の Rest Length Scale の値)
  • type (ここでは bendtwist)
  • stiffness (Bendの Stiffiness の値)
  • damping Ratio (Bend の Damping Ratio の値)

TODO: computeBendTwistRestVector の中身はあんまり分からず...
知っている方がいましたら、教えてほしいです...

この辺かな...

encyclopediaofmath.org

archive.lib.msu.edu

branchweld attribute を持っていたら、createBranchWeldConstraints を呼びます


createBranchWeldConstraints

まず weld と 対象の point を polyline で結び、下記を設定します
値はコードベタ書きです

  • restlength : 0
  • stiffness : 1e20 ( 1.0 * 1020 )
  • dampingratio : 0.001
  • type : branchstitch

その後、bend / twist に適切な point を探します
weld に隣接 point (neighbours) のうち、下記を満たすものです

  • n → weld に向かう half edge のときの n
  • neighbours が 1つしかないとき

見つかれば、computeBendTwistRestVector を用いて restVector を計算します

角度上限を反映し、先程の2点を polyline で結び下記を設定します

  • restvector
  • __bendconstraints (group)

余談ですが、角度上限の条件式を軽く下記のようなコードで検証しました

float maxang = radians(180);

float rad = radians(179);
vector4 restvec = quaternion(rad, set(0, 1, 0));
vector4 v = qconvert(restvec);
float length = length(v);

printf("q %f \n", restvec);
printf("v %f \n", v);
printf("length: %d, maxang: %d\n", length, maxang);

q {0.000000,0.999962,0.000000,0.008727}
v {0.000000,3.124139,0.000000,1.000000}
length: 3.28028, maxang: 3.14159

と、想定している角度比較と計算誤差があるような...
(len がもう少し小さくなってほしいはず)

rad を 171 にすると length と等しくなります

まとめ

これでようやく肝になる部分は読み終わったはず...!
わからないところはいくつかありますが...

以後は Constraint の Output / GUIDE 周りの話になるかと思います

何かあれば Twitter までお気軽にどうぞ~ twitter.com