質問: ### 前提・実現したいこと こちらのサイトを参考に、 RotateAroundメソッドに関して勉強しています。下記質問のご教示お願いします。 ・質問1。 リファレンスを見ると、 ``` public void RotateAround (Vector3 point, Vector3 axis, float angle); ``` と書かれていて、 回転の中心と軸と回転角は引数で指定できるみたいですが、 回転する円の半径の指定はどう設定すればよいのでしょうか? 円の半径は何で設定されていますか? ・質問2。 下記は同等かと思うのですが、 ``` this.transform.TransformDirection (Vector3.up); this.transform.up; ``` 参考にしているサイトは何故、長い書き方をされているか疑問に思いました。 簡潔にthis.transform.upと書いても、同等の処理になりますか? ・質問3。 参考にしているサイトで ``` これをカメラにAddComponentすればターゲットの方を見ながら周りを回転させることができます。 ``` と書かれていますが、 キューブと球で実際試したところ、 キューブが常に球を向いているような回転にはなりませんでした。 回転するオブジェクトが、第1引数で指定した円の中心を見続ける (回転しているオブジェクトのZ軸が常に第1引数の円の中心を向き続ける)には、 もう一工夫の処理が必要となりますよね? それとも、RotateAroundメソッドだけで設定する方法ってありますか? また、回転するオブジェクトが、第1引数の円の中心を回転しつつも、そのオブジェクト自体も自転していました。 これがどういう自転なのか(どういった規則で自転しているのか)わかりません。 この自転は何か意味がありますか? 常に中心を向き続けるという自転ではなさそうでした。 ・質問4。 念の為、確認させていただきたいのですが、RotateAroundの呼び出し元の回転するオブジェクトは、 第2引数のaxisの方向には一切動かいない回転をするということで合っていますか? ### 試したこと ・キューブにアタッチしたスクリプト。 回転の中心を球に指定し、キューブを回転。 ``` void Update() { this.transform.RotateAround(sphere.transform.position, this.transform.up, speed * Time.deltaTime); } ``` 挙動を見てみたら、質問1に関しては、 RotateAroundの呼び出し元の回転するオブジェクトの位置座標と、第1引数の回転する円の中心の座標との距離が 回転半径になるのかと思いましたが、合っていますか?
回答: **質問1** おっしゃるとおり、半径は`RotateAround`を実行した`Transform`の座標と`RotateAround`の引数として与えた中心座標との位置関係によって決まると考えられます。 ですが、半径が回転中心と自身をまっすぐ結んだベクトルの長さそのものになるのは、その結んだベクトルと回転軸ベクトルが直交する場合に限られると思います。そうでない場合も含めて一般的に考えると、半径は「回転中心を通り回転軸ベクトルの方向に伸びる直線」と自身との距離になると言えそうです。 **質問2** これについてはご本人にお訊きしないと分かりませんが、たとえば「`Vector3.up`の部分を書き換えれば、X軸やZ軸、あるいはそれに限らず任意のローカル方向ベクトルを軸にすることができる」ということを暗におっしゃりたかったのかもしれません。 `transform.up`その他を使ってローカル方向ベクトル周りに回す場合、`transform.right * localDir.x + transform.up * localDir.y + transform.forward * localDir.z`みたいな形になってごちゃごちゃするんじゃないでしょうか(無理やり感のあるたとえですみません...)。 **質問3** 「常に中心を向き続ける」というのはLookAtを使ったときのような動作を想像されていますでしょうか? `RotateAround`の「位置と回転が同時に変更されます」というのは、自身の回転量と同じだけ回転中心の周りで円を描くように移動することを指していて(地球の周りを回る月のように、自転と公転の速さが一致しているような状態をイメージしていただくといいかもしれません)、`LookAt`のような機能は持っていないものと思われます。 もし初期状態でキューブが球の方を向いていなければ`RotateAround`後も相変わらずそっぽを向いた状態になるでしょう。ですので、hiyorinさんのおっしゃる「これをカメラにAddComponentすればターゲットの方を見ながら周りを回転させることができます」というのは、暗黙の前提として「初期状態でカメラがターゲットを視界に捉えている」という条件が必要そうです。 **質問4** たぶんその通りかと思います。`axis`は公転面に対して垂直ですので、その公転面上を動いているということは`axis`の方向にはプラス側にもマイナス側にも移動していないはずです(もちろん計算誤差によってごくわずかに移動してしまう可能性はあるかもしれませんが...)。