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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Q&A

解決済

1回答

996閲覧

指定した軸のオブジェクトの回転、オブジェクトの向きについて(LookAt、Quaternion.LookRotation)

Miya_kp

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

0グッド

0クリップ

投稿2022/07/16 16:57

オブジェクトの回転、オブジェクトの向きについて

中心のオブジェクトの指定した軸方向に沿うように中心の周りに球体を回転させつつ、中心のオブジェクトが回転しているオブジェクトの方を向くようにしたいです。

画像のように途中まではいいのですが、回転の中心となるオブジェクトの真上、真下に行くとこのようになってっしまいます。
LookAtの仕様でこうなってしまうと思うのですが、何かいい方法はありますでしょうか?

イメージ説明
コード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class rorate : MonoBehaviour 6{ 7 public GameObject obj1; 8 public GameObject obj2; 9 10 float speed = 50f; 11 12 void Update() 13 { 14 Vector3 axis = obj1.transform.right; 15 obj1.transform.LookAt(obj2.transform.position); 16 17 obj2.transform.RotateAround(obj1.transform.position, axis, -speed * Time.deltaTime); 18 } 19}

obj1に長方体、obj2に球体を入れています。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

確かにLookAtにとって真上や真下は鬼門ですね。代案として、下記のように姿勢を決めるのはどうでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5// 余計なお世話かもしれませんが、「rorate」は「rotate」のつづり間違いでしょうか? 6public class rorate : MonoBehaviour 7{ 8 public GameObject obj1; 9 public GameObject obj2; 10 11 float speed = 50f; 12 13 void Update() 14 { 15 Vector3 axis = obj1.transform.right; 16 17 // 現在のCubeの姿勢に対して、CubeのforwardをSphereの方角に向ける最短回転を合成する 18 obj1.transform.rotation = Quaternion.FromToRotation(obj1.transform.forward, obj2.transform.position - obj1.transform.position) * obj1.transform.rotation; 19 20 obj2.transform.RotateAround(obj1.transform.position, axis, -speed * Time.deltaTime); 21 } 22}

FromToRotationについて

図

水色がobj1.transform.forward、マゼンタ色がobj2.transform.position - obj1.transform.positionです。
Quaternion.FromToRotation(obj1.transform.forward, obj2.transform.position - obj1.transform.position)によって水色をマゼンタ色に重ねるよう回転するクォータニオンが得られ、黄色がその回転軸です。
黄色は水色とマゼンタ色の両方に垂直なベクトルで、これは水色とマゼンタ色の外積の向きとなります。

そして、このクォータニオンを現在のobj1.transform.rotationと組み合わせることで、現在の姿勢からさらに回転させた姿勢を求めてobj1.transform.rotationに再設定しています。
Quaternion-operator * - Unity スクリプトリファレンス」には...

lhs と rhs の回転を組合わせます。

lhs * rhs の積の値で回転させることは、lhs を最初に、それから rhs というように 2 つの回転を順番に行うことと同じです。つまり、回転は、非可換性で、lhs * rhs は rhs * lhs と異なる回転を表すということに気を付けてください。

との解説があり、ご参考になるかと思います。

余談ですが、上記引用の「lhs を最初に、それから rhs」というのが人によってはしっくりこないかもしれません。
実は私はどちらかというとしっくりこない側のクチでして、「【Unity】 Quaternionの回転順の話 - エフアンダーバー」の解釈に賛同する方ではあります。
ですが「[Unity]Quaternionの回転、左が先か?右が先か? - Qiita」にあるように、lhsとrhsのどっちが先に見えるか...は回転前と回転後のどちらの姿勢に注目するかで違ってくるものであり、ご質問者さんにとってしっくりくるとらえ方でいいかと思います。ただし他の人とコードについて意見交換する場合は、もしかすると相手は自分と異なる派閥のとらえ方をしているかもしれないことを頭の隅にでも覚えておいていただくと、コミュニケーションが円滑になるかもしれません。

投稿2022/07/16 22:56

編集2022/07/17 15:52
Bongo

総合スコア10807

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

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

Miya_kp

2022/07/17 06:53

ありがとうございます!うまく動かすことができました! ただ、FromToRotationの部分について、スクリプトリファレンス(https://docs.unity3d.com/ja/current/ScriptReference/Quaternion.FromToRotation.html)を見て理解しようと思ったのですが、 修正していただいたスクリプトの obj1.transform.rotation = Quaternion.FromToRotation(obj1.transform.forward, obj2.transform.position - obj1.transform.position) * obj1.transform.rotation; の部分が理解できていません。 大変恐縮ですが、この部分について解説していただくことはできますか?
Bongo

2022/07/17 15:53

回転部分の式について説明を追記してみましたが、いかがでしょうかね? やはり三次元空間内の回転となると他の方に意図を伝えるのがやっかいになってしまいますね。ご不明点がありましたらお気軽にコメントいただければ返信いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問