ご挨拶
こんばんはコンニチハ
クォータニオン強化週間とのことでなんとか捻り出した内容が今回だ!
前回は魔法の杖に追従する形で魔法陣に見立てたオブジェクトが回転する方法について
記事を書いたが今回は特定な軸を傾けながら、さらに別の軸を回転させてみよう
前回よりやってることは簡単じゃんと思うかもしれないが、計算式に順序があるので
それを知らないと思ったのと違う動きをしてしまうので、それについて実例を見てみよう。
↓前回のクォータニオン記事(ダイマ)
https://qiita.com/sirohige/items/b0d362c32c7db0c52bea
○手始めに回転をおさらい
使用するオブジェクトは前回作った物を流用するので省略。
local Circle=vci.assets.GetTransform("magic_Circle") --①
local count=0 --②
Circle.SetPosition(Vector3.__new(5,1.5,0)) --③
Circle.SetRotation(Quaternion.identity) --④
function update()
count=count+1 --⑤
kaiten=Quaternion.Euler(count,0,0) --⑥
Circle.SetRotation(kaiten) --⑦
end
①「Circle」という変数に「magic_Circle」というオブジェクトを定義。
②関数「count」を0で定義します。
③CircleをX:5、Y:1.5、Z:0の座標位置に移動。
(なぜXに5だって?ディスクトップが写るからだよ!)
④Circleの回転値にクォータニオンの初期値をセット。
(identityでオイラー角X:0度、Y:0度、Z:0度をクォータニオンにた値が入る)
⑤毎フレーム毎に関数「count」に+1します。
⑥関数「Quaternion.Euler(X度,Y度,Z度)」で角度をクォータニオンに変換します。
今回はX軸の角度だけを変化させるため、X軸に「count」を使用しています。
⑦変数「rotation」に⑥で計算したクォータニオン値を入れます。
Z軸を45度傾けた上でX軸を回転させてみよう
クォータニオンはかけ算。コードは簡単。
function update()
count=count+1
kaiten=Quaternion.Euler(0,0,45)*Quaternion.Euler(count,0,0)
Circle.SetRotation(kaiten)
end
・おさらいでは kaiten=Quaternion.Euler(count,0,0) だけだったのを、
kaiten= Quaternion.Euler(0,0,45) * Quaternion.Euler(count,0,0) にしただけ。
・最初に Quaternion.Euler(0,0,45) を持ってくることが重要です。
Z軸45度傾けた物を基準とした上で、 Quaternion.Euler(count,0,0) をさらに
計算するという事が肝です。
計算順序を変えてみよう
では試しに (0,0,45) と (count,0,0) を入れ替えてみましょう。
function update()
count=count+1
kaiten=Quaternion.Euler(count,0,0)*Quaternion.Euler(0,0,45)
Circle.SetRotation(kaiten)
end

なんだか思ってたのと違う動きになりました。
このようにかけ算でありながら前後を入れ替えるだけで挙動が変わるため注意!
基準となる物を先に持ってきてから回転させたい値を計算させましょう。
そもそもクォータニオン同士をかけ算しないといけないのか?
クォータニオンをかけ算しなくとも kaiten=Quaternion.Euler(count,0,45)
では駄目なのか?と思う人が居るかもしれないので試してみましょう
function update()
count=count+1
kaiten=Quaternion.Euler(count,0,45)
Circle.SetRotation(kaiten)
end
はい
まとめ
・世の中は足し算でも引き算でもない、かけ算だ!
・オブジェクトを傾けた上で、さらに回転のような角度指定を行う場合は
初めに基準となるオブジェクトのクォータニオン値を用意してからかけ算をしましょう。
・今回はZ軸を45度傾けた上でX軸を回転する挙動としましたが、
前回のように魔法の杖を基準とする場合、
magic_rod.GetRotation()*Quaternion.Euler(0,count,0)のように
杖のオブジェクトをGetRotationしてから回転値のクォータニオンをかけ算しましょう。
・よく分からない?
基準クォータニオン×回転クォータニオン!
掛け算の順番が大切と覚えておけば大丈夫!カップリングの話じゃないよ!
おまけ
オブジェクトの回転値を知りたくてそのまま print(Circle.GetRotation()) しても
表示されるのはクォータニオン値のXYZWの為、正直よくかんない。

print(Circle.GetRotation().eulerAngles) とすることでXYZのオイラー角が
print(Circle.GetRotation().eulerAngles .x )でX軸だけのオイラー角が帰ってくるので
座標確認や角度の数値が欲しいときそのような使い方をしてみてください。



