Houdini Apprentice Advent Calender の18日目の記事になります。
この記事を作成するにあたって、細かい内容を示したHipファイルがこちらになります。ぜひこのファイルを一緒に見ながらお読みください。
リンク先が切れていた場合、お手数ですが筆者プロフィールからDMにてご連絡ください
また、こちらの記事は@ijiVFXさんのこの記事に影響を受けています。
君はお隣さん?一番近い点?それとも座標?
Quaternion系vex関数
Houdini初心者の方々にとって、回転ってけっこうつまずきがち(だと思っている)ので、こちらの記事でQuaternion系vexの紹介をしてみようと思います。
Quaternionを理解すると回転がめちゃくちゃ操作しやすくなるので!
ということで、Quaternionを扱うvexは以下の通り10個あります。
この関数一つずつ、使い方と挙動をまとめていきたいと思います。
quaternion
まずはQuaternionを作成するところから。
ノードとかで作ったり勝手に作られてたりしますが、もちろんvexで作成できます。
quaternion関数はQuatenionを作成するときによく用いられる関数です。
関数 | 挙動 |
---|---|
quaternion(rotationsmatrix3) | 3×3回転行列rotationsをQuaternionに変換する |
quaternion(anglefloat, axisvector) | ベクトルaxisを回転軸として、角度angle回転するQuaternionを作成する |
quaternion(angleaxisvector) | 正規化した回転軸と回転角度の乗算値angleaxisからQuaternionを作成 |
qrotate
qrotate関数によって、Quaternionでベクトルを回転できます。quaternionを作る関数をいくつかあるんですが、最終的な回転はこの関数によって行われるので、Quaternion系関数の中で最も使われる関数ではないのでしょうか!?
関数 | 挙動 |
---|---|
qrotate(quaternionvector4, vvector) | ベクトルvをquaternionによって回転する |
noiseをもとに回転Quaternionを作成し、qrotate関数を使ってvを回転して移動するという作例です。
ちょっと作例が難しくなってしまいましたが、Solverは分かると楽しいのでぜひ触ってみてください!
eulertoquaternion
eulertoquaternion関数によって、オイラー回転をQuaternion回転に変換できます。
またquaterniontoeuler関数によって、Quaternion回転をオイラー回転に変換できます。
関数 | 挙動 |
---|---|
eulertoquaternion(rotationsvector, orderint) | オイラー角をQuaternionに変換 |
quaterniontoeuler(orientvector4, orderint) | Quaternionをオイラー角に変換 |
eulertoquaternion関数を使ってtransformを作成し、intrinsicsに登録するという作例です。
一つだったらtransformSOPで一発なんですが、まとめて処理したいときに知ってると便利ですね!
dihedral
dihedral関数によって、ベクトルをもう一つのベクトルに回転するQuaternionを計算できます。
個人的に好きな関数です!
関数 | 挙動 |
---|---|
dihedral(avector, bvector) | オイラー角をQuaternionに変換 |
dihedral関数を使ってrotateを作成し、intrinsicsの元のtransformに乗算して設定し直すという作例です。
qmultiply関数を使うことで、元のtransformを考慮して回転できているのがミソですね。
slerp
slerp関数によって、2つのベクトルをミックスしたQuaternionを計算できます。
個人的に、dihedralと合わせてよく使う気がします。
関数 | 挙動 |
---|---|
slerp(q1vector4, q2vector4, biasfloat) | オイラー角をQuaternionに変換 |
dihedral関数を使ってrotateを作成し、slerp関数でコピーのtransformを補完するという作例です。
この二つの組み合わせは強い!
qconvert
qconvert関数によって、Quaternionをmatrixやvectorに変換できます。
これも良く使いますね。
関数 | 挙動 |
---|---|
qconvert(quaternionvector4) | Quaternionをmatrix3に変換 |
qconvert(quaternionvector4, offsetvector) | Quaternionと移動量offsetを使ってmatrixを計算 |
quaternion関数を使ってorientを作成し、offsetをptnumごとに設定して、qconvert関数でmatrixを作るという作例です。
qinvert
qinvert関数によって、Quaternionを反転できます。
使いようによっては使えるときもある…
関数 | 挙動 |
---|---|
qinvert(quaternionvector4) | 反転したQuaternionを計算 |
dihedral関数を使ってorientを作成し、それで回転したものと、反転したものを作るという作例です。
黄色がオリジナル、水色がそのままorient、赤色がinvertって感じですね。
qmultiply
qmultiply関数によって、Quaternion同士を乗算できます。
使いようによっては使えるときもある…
関数 | 挙動 |
---|---|
qmultiply(q1vector4, q2vector4) | 2つのQuaternionを乗算 |
dihedral関数を使ってアニメーションするorientを作成し、それを使ってアニメーションする作例です。
初期状態のorientをqinvert関数で反転させて、元のorientにqmultiplyで乗算することで、無回転スタートをする方法をとっています。この方法を知っているとけっこう便利…!
qdistance
qdistance関数によって、Quaternion同士の角度を計算できます。
使いようによっては使えるときもある…
関数 | 挙動 |
---|---|
qdistance(q1vector4, q2vector4) | 2つのQuaternion間のおおよその角度をラジアンで返す |
slerp関数の作例から、quatからの回転量をqdistance関数で計算して表示してみた作例です。
使いようによってはいろいろできそうですね!
まとめ
Quaternion関数まとめいかがでしたでしょうか。
個人的にはちょっと分かりにくいような気もするので、しっかり勉強したい方はHIPファイルを開いてみてゆっくり中を覗いていただけると理解が深まるかと思います。
あと、ちなみにですが僕の場合は回転計算にQuaternionを使わずにMatrixを使います。理由としてはファイル中にもありますが何かと使い勝手がいいからです。Quaternionに慣れてきたらMatrix触ってみるのもいいと思います!