[Unity] 続、指定した角度まで回す!!

前回、指定した角度で止めるのは分かったものの新たな問題が発生したのでその解決やら。

Unityで回転をする場合、オイラーじゃなくてクォータニオンで制御しているのは前回で把握できて
無事、指定の角度で止めることはできるようになりました。

やれやれ、これでなんとかうまくいきそうだ…と思ったのですが、そこでさらなる問題が起きました。

やりたいこととしては、指定の角度に近いところで止まる…だったので
今の角度を取得→次の停止位置を取得→そこをターゲットにして止まる
にしなければいけません。

しかしながら、1軸で回しているXを eulerAngles.xで取得しようとしても
なぜかおかしな数字が返ってきます。
Debug.Logで確認してみると

フリップしてやがる…

どうやらUnityはRotationOrder xyz になっているらしく、
translate.Rotate( new Vector3 (0f,0f,1f));

translate.eulerAngles.z;
とするならば、問題なく0~360で取得できるものの
今回のようにxを回転してeulerAnglesで取得しようとすると、上記のログのようにフリップしてしまうようです。

うーんこれはzで回すしかないかぁ…それでもできるしいいか…と思ったら

いつものことながらありがたい助言、感謝の限りです。

というわけで、クォータニオンの ToAnglesAxisを使用すると、anglesとaxisに分離できるので
今回のように1軸で回すだけならこれを利用すればxで回しても角度がわかることが判明しました。

出来上がったコードはこんな感じ。
ToAngleAxisは参照渡しで結果を受け取るので、分解した結果を受け取る変数を
引数として渡しています。
帰ってくる数字は0~360~0 axis が 0-360のときは1 360->0のときは-1 で帰ってくるので
そこだけ注意が必要です。

そんな感じで、簡単そうかなと思ったけど思いのほかはまってえらく時間がかかってしまいましたが
おかげで今までよくわからなくて避けてたクォータニオンの使い方とか、C#の書き方とか
だいぶ分かったので良しとします。

良い機会なので、クォータニオン回りの活用法とかもうちょっと勉強しようかと思います。

Unity超たのしい!!

コメントを残す

メールアドレスが公開されることはありません。

*