西暦 2018 年 07 月 11 日
素人が一人前のHoudiniマスターになるまでの記録 No.0032
ボーンの位置を調整したい時、
チュートリアルに従うならRiggingシェルフからBonesツールを起動して
マウスでドラッグしてボーンを移動するのだけれど・・・
プロシージャルモデリング的な観点から、
計算でボーンの位置を決めたい!
と、思い立ち試みる。
どうやら Bone をただ Translate するだけではダメそうなので少し調べてみた。
・・・
ここから長い闘いの末
・・・
できた!
自前で作ったNullノードのコントローラーで、ボーンの構造を調整できるようになった。
長かった。。。
----
以下、わかったことやハマったことの記録。
まずわかったこと。
・ボーンの構造は、どうやらボーンのPre-Transformの回転とBoneLengthパラメータで成り立っているらしい。
-> つまりここに計算式を入れてやればよさそう。
・計算式ってxyz成分それぞれで書かないといけないの?しんどくない?相対角度計算とかどうするの?
-> CHOPノードにObjectノードというものがあった。これで相対位置や角度や距離が計算できる。
・チャンネルパラメータへのアクセスはchop("~")。※ch("~")じゃない!。
-> かなりの時間ハマった…。
・pre-Transformのrotに入れる値は、Objectノードの Compute モードを "Bearing" に指定すれば計算できそう。
-> うまくいった!
だが・・・
・2本目以降のボーンの向きがなぜか合わない!
たぶんどこか回転軸の座標系が間違っている・・・
ここから長考…の末わかったこと。
・ボーンの向きは -Z 方向。(なぜか)
・BearingVectorパラメータに入れるベクトルはボーンのローカル座標系
・したがってBearingVectorパラメータには
「親ボーンの座標系における-Z方向ベクトル(0,0,-1)」を
「今操作したい子ボーンのローカル座標系に変換したベクトル」
を入れるのが正しい。
その結果生まれたネットワークはこんな感じ。

はたしてこれで合っているのか?もっと効率のよい方法があるのではないか?
と、もやもやはするものの
自分の今の知識ではどうせ答えはでないので、いまのところはひとまずこれで。
