確かに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/17 06:53
2022/07/17 15:53