質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

1回答

1578閲覧

【Unity】Quaternionを使用した角度計算について教えてください

super_hogehoge

総合スコア29

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

0グッド

1クリップ

投稿2018/08/18 17:46

前提・実現したいこと

いつも勉強させていただいております。
ゲームエンジンUnityでQuaternionを用いて角度計算を行いたいのですが、
計算誤差が大きすぎて困っております。

ミニマムなサンプルで試しても納得がいかないため質問させてください。

状況

・新規のシーン ・Cube を一つ作成 ※X という名前 ・EmptyObjectを作成し、以下のソースコードをコンポーネントとして登録

該当のソースコード

C#

1public class NewBehaviourScript : MonoBehaviour 2{ 3 void Start() 4 { 5 Transform x = GameObject.Find("X").GetComponent<Transform>(); 6 x.localRotation = Quaternion.Euler(-10, -10, -10); //x,y,zを-10度ずつ回転させる 7 x.localRotation = x.localRotation * Quaternion.Euler(10, 10, 10); //x,y,zを10度ずつ回転させる 8 } 9}

試したこと

上記の処理ですと、
1, それぞれのx,y,z軸に対して-10度ずつ回転させる
2, それぞれのx,y,z軸に対して10度ずつ回転させる

ので、1,2が相殺されて 0, 0, 0になることを期待してたのですが実際には、(1.676, -2.049, -1.458)
のような微小な値が入っており 期待した(0, 0, 0)にはなりません。

オイラー角 と Quaternionの変換の際の計算誤差だとは思うのですが 10度 変更&戻す しただけで1度以上
値がずれてしまうのは納得がいきません……

・私の計算のやり方が間違っているのか
・Quaternionを扱う際の暗黙の手順等があるのか
・普通はこうする等、定跡があるのか

 等々教えていただければ幸いです。非常に単純な事をうかがってしまいご迷惑かとは思いますが宜しくお願い致します。

補足情報(FW/ツールのバージョンなど)

Unity 2018.1
C#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これは軸周り回転の順序の問題かと思われます。

Quaternion.Euler - Unity スクリプトリファレンスによれば、

Returns a rotation that rotates z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis.

z軸周りにz度、x軸周りにx度、y軸周りにy度回転する回転を返します。

とのことです。

よって、Quaternion.Euler(-10, -10, -10)と同等なのはQuaternion.Euler(0, -10, 0) * Quaternion.Euler(-10, 0, 0) * Quaternion.Euler(0, 0, -10)であり、これを打ち消す回転は、回転順序も逆にしたQuaternion.Euler(0, 0, 10) * Quaternion.Euler(10, 0, 0) * Quaternion.Euler(0, 10, 0)となるはずです(ちなみに、この逆回転を再度オイラー角に戻してみると(7.947076, 11.69208, 11.69207)となりました)。

逆回転を求めるには、上記のように軸ごとに分解して組み立ててもいいですが、Inverseを使うのが便利かと思います。
Quaternion.Euler(10, 10, 10)Quaternion.Inverse(Quaternion.Euler(-10, -10, -10))に置き換えてみてはいかがでしょうか?

投稿2018/08/18 21:51

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

super_hogehoge

2018/08/19 05:30

Bongo様 ご回答ありがとうございます。 ご教授下さった内容で問題無く(0,0,0)になりました!。 ・ZXY順に処理する ・Inverseを使用する 後者の方が簡潔なのでInverseを今後使用していこうと思います。 迅速かつ正確なご回答ありがとうございました、非常に助かりました。 ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問