■ [Houdini日記]ビル壁面差し替えのノードの構成を整理メモ
前回のビル構築は手探りで作っててノード構成やアトリビュートに無駄が多かったので、整理と理解のために作り直したので経過をメモ。
全体のノード構成
- attributeCreate1で、プリミティブにprimIdxという名前で$PRのプリミティブ番号を設定
- create_PolyDataでForeachでprimIdx毎にループして、面ごとの高さと幅、回転のデータを生成
- foreach1ノードで面に第二引数のモデルを割り当てる
第二引数の右側ツリーは適当。
create_PolyData(Foreachノード)の中身
- polyframe1 で法線Nを生成
- create_center で$CEX,$CEY,$CEZを使ってcenterという名前のアトリビュートにプリミティブの中心をセット
- vop_points_create_sideVec で、VOPを使って横方向の基準ベクトルを生成(ポリゴン毎の幅を計算するのに使う)
- vop_pimitive_create_size でポリゴンの幅と高さをプリミティブのアトリビュートとして計算
- create_rotY で、ポリゴンのY軸回転の向きを atan2(@N.x,@N.z) で計算
vop_points_create_sideVec
Y軸ベクトルとNの外積を取ってるだけ。
add attributeで生成して、set attributeに値を設定。setはi1にptnumを入れるのを忘れないように。
vop_primitive_create_size
各頂点からcenter(ポリゴン中心)を引いたベクトルを、法線とsideVecそれぞれ内積をとって、最大値から最小値を引くことで幅と高さを求めて、プリミティブのアトリビュートに突っ込む
get attiributeはinputを「First Input」にするのをよく忘れるので注意。
foreach1(生成した面の情報を使って壁面を並べる)
第2引数に生成したプリミティブのアトリビュートを使ってtransformするだけ。
prim("../each1/",$PR,"size",0) とかでeach1ノードの値をとってきてるが、こんなのでいいのか?という感覚が。もうちょっといいやり方はないものか。