すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

Tree GeneratorをKineFXで動かす vol.1 木の作成とKineFX

木をKineFXで動かしてUSD Skelで書き出してみるやつ。

www.youtube.com

※動画のものは葉っぱは揺らしてません。記事は葉っぱも揺らしてあります。

まとめ

良くなかった

・USD Skel周りがいまいち分かっていないところがある

良かった

・USD Skelがかなり便利

・KineFXの仕組みがなんとなく分かった

・ジオメトリキャッシュよりデータも軽いので使いどころ次第ではこちらのほうが良い

・KineFXはVellumと絡めたり手付アニメーションと絡めたり結構便利

Scene File

vol.2にあり

アセット

Megascanesから幹と葉のテクスチャを探して使用。

木の作成

木はLabs Tree Generatorで作成。ここの説明はいろいろなところでされているので省略!

今回は針葉樹をイメージ。

メッシュとカーブを保存するので、キャッシュはRBD Packを使用して両方を同時にキャッシュ。

これ系は今回のような使用方法もあるので使っていきたいところ。

幹と枝のKineFX化

RBD Unpackからカーブを引っ張ってくる。

Labs Tree Generatorで作成したPrimitive Groupが残っているはずなのでそれベースで幹、枝A、枝Bを分ける。

前準備

最終的に最初と最後、枝が接続するポイント以外を削除したい。

まずは元々ある最初と最後以外のグループを作成

Boolean Curveを使用して枝Aが幹に交わる部分にポイントを作成し、

最初と最後以外の元々あるポイントを削除する。

そうして最低限枝がつながるポイントと最初と最後のポイントのみになる。

幹はSortでYベースでポイント番号を整理して終了。

枝A

グレーが枝Bで青が枝A(枝Aから更に生えている枝が枝B)

枝の末端のポイントと、幹と同じように最初と最後以外のポイントのグループを作成する。

※後で枝Bでも使うので軽くてもCompile Blockを使用する。

枝Aも幹と同じように枝Bとの接続ポイントと最初と最後以外のポイントを整理する。

枝B

枝Bも同様に整理するが、これに接続するものはないのでポイント数を削減するだけ。

接続ポイントと最初と最後以外のポイントのグループを作る処理は枝Aでも行っているので、Invokeを使用してCompile Block内の処理を流用する。

Invokeの説明

InvokeはCompile Block内の処理をネットワーク内で流用することができる。

まず流用したい元のCompile Block BeginのInput Nameになにか入れる。

InvokeのCompile Blockパラメーターに流用したいCompile BlockのEndを指定し、Input Nameに先程の元のCompile Block BeginのInput Nameを指定する。

KineFX Rigの作成

fuseで枝や幹を合体する。念の為Edge Transport等で一つになっているかを確認。

Labs PolyWire UVノードのFix Cyclic Edge〜〜をオンにする。

このチェック一個で今まで面倒だったKineFX化のエラーを回避できる。が、Primitiveを再構成するため、アトリビュートが消失するので注意。

Labs PolyWireUVの第二入力のみを使用し、幹のポイントグループを作成。

幹のグループのみ名前をtrunk_@ptnumにする。Rig DoctorとOrient JointsでKineFXは完了。あとで使用するのでRig Stach Poseでrest_transformも作成しておく。

Rig Wrangleでのアニメーション

Attribute NoiseでのノイズベースにRotateをRIgWrangleでアニメーションさせている。

VEXをは画像のような感じで、multパラメーターで最大の回転具合の制御のみをしている。

vector axis = cross(v@N,v@up);
float rad = radians(f@rotVal * chf("mult"));

rotate(4@localtransform, rad, axis);
メッシュのバインド

ざっくりウェイトがアレばよかったのでBone Capture Proxmityでウェイトを作成。

通常Bone Capture Biharmonicのほうが精度が良いが、今回はざっくりウェイトがアレばいいのでProxmityで速度を重視。

キャラクターなどはちょっと遅いがBone Capture Biharmonicのほうが良い。更にいうとそれをカスタムしたHDAとしてJoint Capture Biharmonicがあるので普段遣いはこれがいい。

Bone Capture BiharmonicのMax InfluenceやDrop Offを調整して破綻が見えないぐらいにする。

Joint Deform

Joint Deformノードに繋いで結果を確認する。

USD Skelにする際はこれは使わない。Geometry Cacheの場合はこのノードのあとでキャッシュする。

葉のKineFX化

前準備

Connectivityで葉ごとに識別アトリビュートを作る。

UVをPointにPromoteし、Rayでhitprimとhitprimuvを取得しておく。

PointにしたUV使用して@P=@uvとMatch Sizeで原点にメッシュを移動する。

Divide, Endsでカーブのみにし、Tranformで特定の軸をScale=0にしてからfuseで1つのカーブになるようにする。

幹や枝と同じように最初と最後以外のポイントを削除し、Subdivideで再度分割数を決める。

※この処理でカーブが多すぎると後処理が大変になるのでカーブの数には注意。

RayでMatch size後からhitprimとhitprimuvを再取得する。

Attribute Interpolateで作成したカーブを元のメッシュの位置に戻す。

幹や枝と同様に根本のポイントグループを作成し、葉の一番先端にRigがあっても意味がないので先端のポイントは削除する。

KineFX Rigの作成

Rig Doctorを通すと重すぎるのでPoint Wrangleで@nameを作成。

※この状態ならKineFX化で不正な状態には基本ならない

Rig Stash Poseでrest_transformも作成。

KineFXのParent

枝と幹のRigのnameからparentアトリビュートを作成。

作成した葉の根本のグループのみRayをして、最も近い枝か幹からparentのアトリビュートを取得し、結果をPointにPromote

Rig Attribute VOPに画像のようにつなぎ、Run OverをPointにする。

※Run Overを変更しないと1つ目のポイントのみ処理される。

Rig Attribute VOP内

ptnumをGet Point Transformにつなぎ、Import Point Attributeにもつなぐ。Import Point Attributeは第一入力の該当するポイントからparentアトリビュートを探し、

その結果を元に第二入力のnameからFind Attribute Valueでポイント番号を探す。見つかったポイント番号からGet Point Transformとrest_transformを取得し、

上記見つかったアトリビュートをParent Constraintノードの該当箇所へつなぐ。

Rig Wrangleでのアニメーション

ここは枝や幹と処理は一緒。

上記Rig Attribute VOPで枝にParentしているので何もしなくても揺れる動作を継承しているはず。

メッシュのバインド

ここも枝や幹と同じ。値は適宜調整。