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

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

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

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

Q&A

解決済

1回答

957閲覧

ジンバルロック?円形にオブジェクトを配置して、回転をかけると、一つ目だけ角度がおかしくなる

aro

総合スコア21

Unity

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

0グッド

0クリップ

投稿2020/07/27 01:38

編集2020/07/27 04:15

前提・実現したいこと

円形に弾オブジェクトを配置し、弾を敵の方向に向かせ、そこから30度回転をかけてます。
しかし、1個目だけ何故か向いている方向がおかしいです。
イメージ説明

該当のソースコード

C#

1public IEnumerator Generate(GameObject prefab, int count, GameObject center, float distance, bool isLookAtCenter = true) 2 { 3 for (int i = 0; i < count; i++) 4 { 5 var position = center.transform.position + (Quaternion.Euler(0f, 0f, (360f / count) * i) * center.transform.up * distance); 6 var obj = Instantiate(prefab, position, Quaternion.identity); 7 8 if (isLookAtCenter) 9 { 10         //中央を向かせる 11 Vector3 diff = center.transform.position - obj.transform.position; 12 //※ここが怪しい 13 obj.transform.rotation = Quaternion.FromToRotation(Vector3.up, diff); 14 15         //30度ずらす 16 Quaternion rot = Quaternion.AngleAxis(30, Vector3.forward); 17 Quaternion q = obj.transform.rotation; 18 obj.transform.rotation = q * rot; 19 } 20 }

試したこと

Debug.Log()で※印の箇所のobj.transform.rotationを見てみると、
一つ目だけ(1.0, 0.0, 0.0, 0.0)とxに値が入っており、
2つ目以降は
(0.0, 0.0, 1.0, -0.1)
(0.0, 0.0, 1.0, -0.3)
(0.0, 0.0, 0.9, -0.4)
となっており、xは0で、zとwに値が入っていました。
なので、中央を向かせた時点で既におかしいようです。
ただ、30度ずらさない場合は、向きはおかしくないです(該当箇所は真上を向いてるので)
イメージ説明

Quaternion.FromToRotationに問題があるように思っております。
ジンバルロック?とか詳しくわからないのですが、そういうのがあるのでしょうか…
解決方法と、可能でしたら原因も教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Quaternion.FromToRotationの部分にご注目なさっているのは的確だと思います。回転が(1.0, 0.0, 0.0, 0.0)ということは、これは「X軸周り180°回転」を意味するはずですから、その弾だけ裏返ってしまったのでしょうね。弾の絵が左右対称なので気付きにくかったんじゃないかと思います。

似たような事例として、以前「unityでQuaternion.Slerpを使って2dオブジェクトの角度を少しずつ変更する際に裏返りが起きてしまう」とのご質問を見かけたことがあったのですが、あちらと同様に

C#

1obj.transform.rotation = Quaternion.FromToRotation(Vector3.up, diff);

C#

1obj.transform.rotation = Quaternion.Euler(0.0f, 0.0f, Vector2.SignedAngle(Vector2.up, diff));

としてみるとどうでしょうか?

投稿2020/07/27 09:42

Bongo

総合スコア10807

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

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

aro

2020/07/27 11:08 編集

ご回答ありがとうございます! ご回答のコードで、正しい方向を向きました!値も(0.0, 0.0, 1.0, 0.0)になってくれました^^ リンク先大変参考になりました。 >180°反転する場合は最短回転軌道が無数に現れますので、裏返って逆に向く回転が選ばれてしまうことはありそう 自分で調べた際に以下のサイトで、同様のことが言われており、上記の回答で書いてある意味がなんとなくわかりました。 https://xr-hub.com/archives/11515 >最短で方向を切り替えたい時に使用することが多いです。 >ただし、注意点として、スタートとゴールが決まっているだけで途中の過程は無限に存在するので、自分が思っている回転にならない可能性があります。 裏返ってる状態でも、向きは同じという判定になるのですね。 ゴールの方向を向けば良いので、軸がどれでも良いという感じなのですかね…(多分) 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問