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

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

ただいまの
回答率

88.77%

RotateAroundメソッドに関して

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,651

tkmnusr

score 320

前提・実現したいこと

こちらのサイトを参考に、
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引数の回転する円の中心の座標との距離が
回転半径になるのかと思いましたが、合っていますか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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/06/01 13:44 編集

    ご回答ありがとうございます。

    質問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の方向へはプラス側にもマイナス側に動かないということですね。
    ありがとうございます。

    キャンセル

  • 2019/06/01 16:00

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

    キャンセル

  • 2019/06/01 16:13

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

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る