読者です 読者をやめる 読者になる 読者になる

Houdiniを学生が勉強してみた

大学入るまでAdobeを知らず、VFXという単語しか知らなかった学生がHoudiniを勉強するブログ

【サンプルファイル】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.

f:id:houdinifx:20160702093841p:plain

赤枠を見てく、あとはDOP用の左のジオメトリはセッティング無いので

f:id:houdinifx:20160702093844p:plain

constraintnetworkは基本この形

このノードでは1枚目赤枠のSOPからどのノードを使うか引っ張ってきてる

f:id:houdinifx:20160702093847p:plain

Hard constraint relationshipノードは後述のSOP内からアトリビュートを引っ張ってきてます

f:id:houdinifx:20160702101908p:plain

ここからですね

基本的に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個目の設定

f:id:houdinifx:20160702105836p:plain

f:id:houdinifx:20160702105924p:plain

接続部までの長さをここで決めています

Dop側に読み込んだ順を基準にした長さに生成します

ここでは左の球体か右への球体への距離ですね

いまいちわからないって方はシェルフのRBD Pin Constraintを使ってみてください

仕組みは少し違いますが、イメージが付きやすいかも

ちなみにサンプルの表示動画はこの三種類です、はてなブログ動画投稿は直接できないので後から考える

 

AngularMotorDenting

This example demonstrates how angular motors can be used with pin constraints to create a denting effect.

f:id:houdinifx:20160702200551p:plain

それぞれの役割は前回とほぼ同じ、ただし今回はセッティングがあります

f:id:houdinifx:20160702113725p:plain

concatは、ここではstring concat(string s1, string s2, string s3)の形で

指定した文字列すべてを単一の文字列に連結してくれます

ここでは3つの要素が組み合わさってますね

chs("prefix")は同じノードにAttributeタブにprefixという名前が追加されてるのでそこからとってきてるだけ

"_"は単純に下線

itoaはstring itoa(int number)の形で、整数を文字列に変換しています

そこで「object_プリミティブナンバー」の形が作られています

左の赤枠でそれが確認できます

f:id:houdinifx:20160702203942p:plain

補足すると、この部分のチェック必要です。

constraints下のConnectAdjacentPiecesで意味を持ちます

f:id:houdinifx:20160702120403p:plain

こういう形でもありなのかな、やらないけれども

CustomVariableMappingぐらいか

f:id:houdinifx:20160702204913p:plain

上のDeleteでプリミティブだけ消してますね

その後Addで点を作って基準点を、そしてConnectしてます(ここではSearchRadiusの値を上げないと接続されないので注意)

 

さて、ここからがこのサンプルのやりたいことの話

f:id:houdinifx:20160702213323p:plain

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 I on Vimeo

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の変更ができます
色々試してみてください