14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Houdini ApprenticeAdvent Calendar 2022

Day 18

目指せ回転マスター!Quaternion系VEX関数まとめ

Posted at

Houdini Apprentice Advent Calender の18日目の記事になります。

この記事を作成するにあたって、細かい内容を示したHipファイルがこちらになります。ぜひこのファイルを一緒に見ながらお読みください。
リンク先が切れていた場合、お手数ですが筆者プロフィールからDMにてご連絡ください

また、こちらの記事は@ijiVFXさんのこの記事に影響を受けています。
君はお隣さん?一番近い点?それとも座標?

Quaternion系vex関数

Houdini初心者の方々にとって、回転ってけっこうつまずきがち(だと思っている)ので、こちらの記事でQuaternionvexの紹介をしてみようと思います。
Quaternionを理解すると回転がめちゃくちゃ操作しやすくなるので!

ということで、Quaternionを扱うvexは以下の通り10個あります。
image.png
この関数一つずつ、使い方と挙動をまとめていきたいと思います。

quaternion

まずはQuaternionを作成するところから。
ノードとかで作ったり勝手に作られてたりしますが、もちろんvexで作成できます。
quaternion関数はQuatenionを作成するときによく用いられる関数です。

関数 挙動
quaternion(rotationsmatrix3) 3×3回転行列rotationsQuaternionに変換する
quaternion(anglefloat, axisvector) ベクトルaxisを回転軸として、角度angle回転するQuaternionを作成する
quaternion(angleaxisvector) 正規化した回転軸と回転角度の乗算値angleaxisからQuaternionを作成
  • 作例
    image.png
    quaternion関数を使ってオブジェクトを回転する作例です。
    orientアトリビュートをQuaternionで作成しています。

qrotate

qrotate関数によって、Quaternionでベクトルを回転できます。quaternionを作る関数をいくつかあるんですが、最終的な回転はこの関数によって行われるので、Quaternion系関数の中で最も使われる関数ではないのでしょうか!?

関数 挙動
qrotate(quaternionvector4, vvector) ベクトルvquaternionによって回転する
  • 作例
    image.png

noiseをもとに回転Quaternionを作成し、qrotate関数を使ってvを回転して移動するという作例です。
ちょっと作例が難しくなってしまいましたが、Solverは分かると楽しいのでぜひ触ってみてください!

eulertoquaternion

eulertoquaternion関数によって、オイラー回転をQuaternion回転に変換できます。
またquaterniontoeuler関数によって、Quaternion回転をオイラー回転に変換できます。

関数 挙動
eulertoquaternion(rotationsvector, orderint) オイラー角をQuaternionに変換
quaterniontoeuler(orientvector4, orderint) Quaternionをオイラー角に変換
  • 作例
    image.png

eulertoquaternion関数を使ってtransformを作成し、intrinsicsに登録するという作例です。
一つだったらtransformSOPで一発なんですが、まとめて処理したいときに知ってると便利ですね!

dihedral

dihedral関数によって、ベクトルをもう一つのベクトルに回転するQuaternionを計算できます。
個人的に好きな関数です!

関数 挙動
dihedral(avector, bvector) オイラー角をQuaternionに変換
  • 作例
    image.png

dihedral関数を使ってrotateを作成し、intrinsicsの元のtransformに乗算して設定し直すという作例です。
qmultiply関数を使うことで、元のtransformを考慮して回転できているのがミソですね。

slerp

slerp関数によって、2つのベクトルをミックスしたQuaternionを計算できます。
個人的に、dihedralと合わせてよく使う気がします。

関数 挙動
slerp(q1vector4, q2vector4, biasfloat) オイラー角をQuaternionに変換
  • 作例
    image.png

dihedral関数を使ってrotateを作成し、slerp関数でコピーのtransformを補完するという作例です。
この二つの組み合わせは強い!

qconvert

qconvert関数によって、Quaternionmatrixvectorに変換できます。
これも良く使いますね。

関数 挙動
qconvert(quaternionvector4) Quaternionmatrix3に変換
qconvert(quaternionvector4, offsetvector) Quaternionと移動量offsetを使ってmatrixを計算
  • 作例
    image.png

quaternion関数を使ってorientを作成し、offsetをptnumごとに設定して、qconvert関数でmatrixを作るという作例です。

qinvert

qinvert関数によって、Quaternionを反転できます。
使いようによっては使えるときもある…

関数 挙動
qinvert(quaternionvector4) 反転したQuaternionを計算
  • 作例
    image.png

dihedral関数を使ってorientを作成し、それで回転したものと、反転したものを作るという作例です。
黄色がオリジナル、水色がそのままorient、赤色がinvertって感じですね。

qmultiply

qmultiply関数によって、Quaternion同士を乗算できます。
使いようによっては使えるときもある…

関数 挙動
qmultiply(q1vector4, q2vector4) 2つのQuaternionを乗算
  • 作例
    image.png

dihedral関数を使ってアニメーションするorientを作成し、それを使ってアニメーションする作例です。
初期状態のorientqinvert関数で反転させて、元のorientqmultiplyで乗算することで、無回転スタートをする方法をとっています。この方法を知っているとけっこう便利…!

qdistance

qdistance関数によって、Quaternion同士の角度を計算できます。
使いようによっては使えるときもある…

関数 挙動
qdistance(q1vector4, q2vector4) 2つのQuaternion間のおおよその角度をラジアンで返す
  • 作例
    image.png

slerp関数の作例から、quatからの回転量をqdistance関数で計算して表示してみた作例です。
使いようによってはいろいろできそうですね!

まとめ

Quaternion関数まとめいかがでしたでしょうか。
個人的にはちょっと分かりにくいような気もするので、しっかり勉強したい方はHIPファイルを開いてみてゆっくり中を覗いていただけると理解が深まるかと思います。
あと、ちなみにですが僕の場合は回転計算にQuaternionを使わずにMatrixを使います。理由としてはファイル中にもありますが何かと使い勝手がいいからです。Quaternionに慣れてきたらMatrix触ってみるのもいいと思います!

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?