teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

誤字を修正

2017/10/23 22:41

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  コードを十分追っていないのですが、一つ気になる点として、ミノの姿勢を```if (transform.rotation == new Quaternion(0, 0, 90, 0))```という風に判定しようとしているのは、意図通りにはいかないのではないかな...?と感じました。
2
2
 
3
- おそらく、Z軸周りの回転が90°か、-180°か、-90°か、それ以外(無回転)かで場合分けしたいのかと推察しますが、```new Quaternion(0, 0, 90, 0)```で生成されるのは「z成分が90のクォータオン」のはずで、これは「Z軸周り90°回転を表現するクォータオン」とは異なるかと思います(ややこしい話ですみませんが、クォータオンのx、y、z、wはオイラー角がそのまま入っているわけではないのです...[Quaternionによる3次元の回転変換 - Qiita](https://qiita.com/kenjihiranabe/items/945232fbde58fab45681#quaternion)などがご参考になるでしょうか?)。
3
+ おそらく、Z軸周りの回転が90°か、-180°か、-90°か、それ以外(無回転)かで場合分けしたいのかと推察しますが、```new Quaternion(0, 0, 90, 0)```で生成されるのは「z成分が90のクォータオン」のはずで、これは「Z軸周り90°回転を表現するクォータオン」とは異なるかと思います(ややこしい話ですみませんが、クォータオンのx、y、z、wはオイラー角がそのまま入っているわけではないのです...[Quaternionによる3次元の回転変換 - Qiita](https://qiita.com/kenjihiranabe/items/945232fbde58fab45681#quaternion)などがご参考になるでしょうか?)。
4
4
 
5
5
  オイラー角からのクォータニオン生成は[Euler](https://docs.unity3d.com/ScriptReference/Quaternion.Euler.html)を使うのが便利かと思います。ひとまず3カ所の姿勢判定部分を```if (transform.rotation == Quaternion.Euler(0, 0, 90))```の形にしてみて、どうなるか確認されるのがよいのではないでしょうか。
6
6
  あるいは、逆に```transform.rotation```からオイラー角を抽出する形にして、```if (Mathf.Approximately(transform.rotation.eulerAngles.z, 90))```、```if (Mathf.Approximately(transform.rotation.eulerAngles.z, 180))```、```if (Mathf.Approximately(transform.rotation.eulerAngles.z, 270))```でもいいかもしれません(ついでに==で比較する代わりに[Approximately](https://docs.unity3d.com/ScriptReference/Mathf.Approximately.html)を使って、もし小数の微妙な誤差が発生しても許容するようにしてみました)。

1

eulerAnglesはプラスの角度を返すようなので、それを考慮してコード例を追加

2017/10/23 22:41

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -3,6 +3,6 @@
3
3
  おそらく、Z軸周りの回転が90°か、-180°か、-90°か、それ以外(無回転)かで場合分けしたいのかと推察しますが、```new Quaternion(0, 0, 90, 0)```で生成されるのは「z成分が90のクォータ二オン」のはずで、これは「Z軸周り90°回転を表現するクォータ二オン」とは異なるかと思います(ややこしい話ですみませんが、クォータ二オンのx、y、z、wはオイラー角がそのまま入っているわけではないのです...[Quaternionによる3次元の回転変換 - Qiita](https://qiita.com/kenjihiranabe/items/945232fbde58fab45681#quaternion)などがご参考になるでしょうか?)。
4
4
 
5
5
  オイラー角からのクォータニオン生成は[Euler](https://docs.unity3d.com/ScriptReference/Quaternion.Euler.html)を使うのが便利かと思います。ひとまず3カ所の姿勢判定部分を```if (transform.rotation == Quaternion.Euler(0, 0, 90))```の形にしてみて、どうなるか確認されるのがよいのではないでしょうか。
6
- あるいは、逆に```transform.rotation```からオイラー角を抽出する形にして、```if (Mathf.Approximatelytransform.rotation.eulerAngles.z, 90))```でもいいかもしれません(ついでに==で比較する代わりに[Approximately](https://docs.unity3d.com/ScriptReference/Mathf.Approximately.html)を使って、もし小数の微妙な誤差が発生しても許容するようにしてみました)。
6
+ あるいは、逆に```transform.rotation```からオイラー角を抽出する形にして、```if (Mathf.Approximately(transform.rotation.eulerAngles.z, 90))```、```if (Mathf.Approximately(transform.rotation.eulerAngles.z, 180))```、```if (Mathf.Approximately(transform.rotation.eulerAngles.z, 270))```でもいいかもしれません(ついでに==で比較する代わりに[Approximately](https://docs.unity3d.com/ScriptReference/Mathf.Approximately.html)を使って、もし小数の微妙な誤差が発生しても許容するようにしてみました)。
7
7
 
8
8
  ※ちなみに、```Quaternion.Euler(0, 0, 90)```で作ったクォータニオンの各成分を見てみると、xが0、yが0、zが0.7071068、wが0.7071068になっていました。回転軸が(0, 0, 1)で、sin(90° / 2) = cos(90° / 2) = 0.7071068...ですので、確かに先に挙げたサイトの解説と合致しておりました。