【サンプルファイル】Houdiniを知る constraintnetwork編
Q.【サンプルファイル】って?
A.インストール時にHoududiniにはサンプルファイルが付いてる、ヘルプ見てると各ノードの下の方に出てくるやつです。こんな使い方あるよって具体例。
デフォルトだとこのパスに入ってるはず
C:ProgramFiles/SideEffectsSoftware/Houdini_version/houdini/help/exsample
今回のパス
.../exsample/nodes/dop/constraintnetwork/..
Houdiniのサンプルファイルの有用性を考える
なんとなくで理解してることあったので、サンプル見て学んでみる
画像は追加予定
キーワード
・Hard Constraint Relationship
・Glue Constraint Relationship
・Constraint Network
Helpはここらの単語を参照
AnchorPins
This example demonstrates how different anchor positions can affect pin constraints.
赤枠を見てく、あとはDOP用の左のジオメトリはセッティング無いので
constraintnetworkは基本この形
このノードでは1枚目赤枠のSOPからどのノードを使うか引っ張ってきてる
Hard constraint relationshipノードは後述のSOP内からアトリビュートを引っ張ってきてます
ここからですね
基本的にconstraint_typeとconstraint_nameが付いてます
短いのでWrangleで書いてもいいかもしれません
s@constraint_type="position";
s@constraint_name="Pin";
一応気を付けてるのがPrimitiveレベルのStringアトリビュートだということ
nameは名前なんで自由ですが、typeはpositionとrotateとallの三種ですね、書いてない場合のデフォルト値はpositionになります
ここまでは基本形
ここでのSwitchノードで三種試せます
1種は単純にConnectしてるやつ
以下2個目と3個目の設定
接続部までの長さをここで決めています
Dop側に読み込んだ順を基準にした長さに生成します
ここでは左の球体か右への球体への距離ですね
いまいちわからないって方はシェルフのRBD Pin Constraintを使ってみてください
仕組みは少し違いますが、イメージが付きやすいかも
ちなみにサンプルの表示動画はこの三種類です、はてなブログ動画投稿は直接できないので後から考える
AngularMotorDenting
This example demonstrates how angular motors can be used with pin constraints to create a denting effect.
それぞれの役割は前回とほぼ同じ、ただし今回はセッティングがあります
concatは、ここではstring concat(string s1, string s2, string s3)の形で
指定した文字列すべてを単一の文字列に連結してくれます
ここでは3つの要素が組み合わさってますね
chs("prefix")は同じノードにAttributeタブにprefixという名前が追加されてるのでそこからとってきてるだけ
"_"は単純に下線
itoaはstring itoa(int number)の形で、整数を文字列に変換しています
そこで「object_プリミティブナンバー」の形が作られています
左の赤枠でそれが確認できます
補足すると、この部分のチェック必要です。
constraints下のConnectAdjacentPiecesで意味を持ちます
こういう形でもありなのかな、やらないけれども
CustomVariableMappingぐらいか
上のDeleteでプリミティブだけ消してますね
その後Addで点を作って基準点を、そしてConnectしてます(ここではSearchRadiusの値を上げないと接続されないので注意)
さて、ここからがこのサンプルのやりたいことの話
AngularMotorは軸を設定することで角度によるConstraintの影響を変えられます
helpの内容持ってこようとしたらこの部分だけ消えてる…
NumberofMotorsを0~3と値を変えてたら分かるはず
BreakingSpring
かかる力が一定数以上になると破壊する方法
注目するのはDOP
使うRelationshipはspring_constraints
画像①
DOP内のSOPSolverが要
@force>1500でPrimitiveを消している
画像②
なぜPrimitiveを壊すのか?
事前に設定したconstraint_nameとconstraint_typeを削除することができます
イメージ的にはRealationship(関係)を削除している
forceって?
→Gravity Forceノードを見れば分かるけど、シミュレーションにかかる力?
自分も詳細な正確性をちゃんと分かってない
例えば0を1つ書いて、@force>15000にすると二度目の衝突でも関係が壊れないのでそのままboxの形を保つ
Chains
鎖のシミュレーション方法
2つ前の「AngularMotorDenting」の内容と同じ
変わっているのはpin_constraintsノードのAngularMotorのNumberofMotersが0にしている(軸による拘束がないので鎖のように自由に跳ねている)
画像③
ControlledGlueBreaking
グルーで
注目するのはconstraitとDOP
画像④
DOPimportはObjectMaskを使うことでDOP内のオブジェクトやアトリビュートを持って来ることができます
ここではPackしているbridge columnsの2種類
ちなみにDOP I/OではAttributeをvelだけ取得なんてことできます使い分けるといいかも
TimeShiftノードで1frameだけを取得
その後、いつもの流れでconstraintのnameとtypeを決め
i@propagate_iterationを決定しています
ここの詳しい話はHoudiniJapanCommunityでKenTakiさんのコメントがあったのでコピペすると
propagation rate は 0 と 1 の間で設定され、伝わった Impulse がどの程度Glue bond を伝わって隣り合うオブジェクトに広がるかを決定します。0では何も伝わらず、1で隣り合うすべてのオブジェクトに均等に伝わります。
どれだけ伝わるかって話ですね
AttributeTransferでPointのCdを映して、PromoteでPrimitive化、そしてCd基準にDelete
AttributeTransferは何なのか分からない人のためにPQ先生と火星さん(pcopenだけど)へ
Attribute Transfer II on Vimeo
火星防衛戦線:Houdini チュートリアルーーVOP Transferーー
画像⑤
DOPではGlueConstraintのStrengthが-1、ConstraintNetworkのOverwritewithSOPがつねに1になってます
Strengthが-1になると無限の強度が付きます、戦闘力53万的なアレ
OverwritewithSOPが1だとどのフレームでもそのSOPのRelationshipを読み込んでくれます
GlueConstraintNetwork
面によって強度を変える方法
注目するのはconstraint_network内のWrangle
画像⑥
いつものconstraint_name決める流れ一緒にこの記述
if (@primnum < 50)
f@strength = 2.0;
else
f@strength = 1.0;
プリミティブナンバーが50以下でそれ以外より強度が2倍になる
constraint_typeの記述はないのでposition
Hinges
AngularMotorDentingやChainのようなPinConstraintを使ったもの
止めている場所が2箇所に増えただけかな
PointAnchors
他の項目と結構違うので機会があれば解読する
WireSolverを使った表現
SpringToGlue
フレームでスプリングからグルーにConstraintNetworkを切り替えます
注目はDOP内
GlueConstraintRelationshipノードを作っておきます、constraint_nameは事前に作る必要はないです
SOPSolver内でconstraint_name = "glue"を作ります
EnableSolverは$F=の条件を書くことでconstraint_nameをGlueに切り替えてます
試しに$F==4の場合と、$F==22の場合を比べると分かりやすいです
他にもSopSolver内に条件式を書くことで、破片の角度でもconstraint_nameの変更ができます
色々試してみてください