回答編集履歴
2
誤字を修正
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のクォータ
|
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はプラスの角度を返すようなので、それを考慮してコード例を追加
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.Approximately
|
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...ですので、確かに先に挙げたサイトの解説と合致しておりました。
|