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

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

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

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

Q&A

解決済

1回答

1970閲覧

RotateAroundメソッドに関して

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2019/05/31 18:37

編集2019/05/31 18:39

前提・実現したいこと

こちらのサイトを参考に、
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の方向には一切動かいない回転をするということで合っていますか?

試したこと

・キューブにアタッチしたスクリプト。
回転の中心を球に指定し、キューブを回転。

C#

1 void Update() 2 { 3 this.transform.RotateAround(sphere.transform.position, this.transform.up, speed * Time.deltaTime); 4 }

挙動を見てみたら、質問1に関しては、
RotateAroundの呼び出し元の回転するオブジェクトの位置座標と、第1引数の回転する円の中心の座標との距離が
回転半径になるのかと思いましたが、合っていますか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問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の方向にはプラス側にもマイナス側にも移動していないはずです(もちろん計算誤差によってごくわずかに移動してしまう可能性はあるかもしれませんが...)。

投稿2019/05/31 22:44

Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2019/06/01 05:03 編集

ご回答ありがとうございます。 質問1 なるほど、回転中心と自身をまっすぐ結んだベクトルと回転軸ベクトルが直交しない場合、 回転平面上に第1引数の中心点はないということですね? 第1引数は必ず回転する円の中心点になるのかと誤解してましたが、正確には回転軸の位置を決める為のもので、回転軸ベクトルと呼び出し元のTransformの座標が直行するベクトルの平面上で回転するということなのですね? 動きを確認してみました。 質問2 X軸やZ軸は、ローカルでもthis.transform.rightやthis.transform.forwardで表すことができるので、 X軸, Y軸, Z軸以外の任意のベクトルのときに威力を発揮するということでしょうか? つまり、任意のベクトルをlocalDirとすると、 下記は同等ということでしょうか? this.transform.TransformDirection(localDir); this.transform.right * localDir.x + this.transform.up * localDir.y + this.transform.forward * localDir.z; 質問3 はい、LookAtのようなことです。 なるほど、回転するオブジェクトは、初期位置の円の中心への方向ベクトルが、ずっと円の中心を向き続けて回転(公転)するように自転していたということだったのですね。 太陽と月の関係でイメージがわかり、実際それを意識して動いている所を確認した所、動きが理解できました。 質問4 誤差でもない限り、axisの方向へはプラス側にもマイナス側に動かないということですね。 ありがとうございます。
Bongo

2019/06/01 07:00

ご参考になりましたようで幸いです。質問2の件についても、おっしゃる通りのことを意図しておりました。
退会済みユーザー

退会済みユーザー

2019/06/01 07:13

ご回答ありがとうございます。 とても勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問