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

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

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

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

Q&A

解決済

1回答

1430閲覧

RotateAroundメソッドの回転半径の設定

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2019/06/02 16:14

編集2019/06/02 16:17

前提・実現したいこと

こちらのサイトでRotateAroundメソッドの回転半径の設定について勉強しています。
円の中心から遠ざける場合のコードについて疑問点があるので、ご教示お願いします。

該当のソースコード

こちらのコードなのですが、

C#

1// カメラを挟んで、物体とは反対側の座標 2var otherSide = target.position - diff * 2;

下記のように書き換えて問題ありませんか?

C#

1var otherSide = this.transform.position - diff;

個人的には、this.transform.positionを起点にしてdiffの距離遠ざけるこの書き換えの方が
直感的でしっくりくるのですが、
元のコードは、target.positionを起点にして、diff * 2の距離遠ざけていますが、何か意図はありますか?
それとも、今回のコードに関しては、下記は同等と認識してよいですか?

C#

1var otherSide = target.position - diff * 2; 2var otherSide = this.transform.position - diff;

(ちなみにどちらのコードでも無限に遠ざかりますよね?)

試したこと

カメラだとわかりづらいので、円の中心を球、回転するオブジェクトをCubeにして、
下記スクリプトをCubeにアタッチして試してみました。
動き的には変わりなさそうに見えましたが、
今回の書き換えで不具合が生じる部分がないか質問させていただきました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Sample : MonoBehaviour 6{ 7 [SerializeField] 8 GameObject target; 9 10 float zoomSpeed = 10f; // ズームの速度 11 float minimumDistance = 1f; // 対象物との最小距離(これ以上接近しない) 12 float rotateSpeed = 50f; // 回転の速度 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 18 } 19 20 // Update is called once per frame 21 void Update () 22 { 23 // 対象物とカメラとの相対座標 24 var diff = target.transform.position - this.transform.position; 25 26 // Aキーで対象物に接近する(最小距離よりは接近しない) 27 if ( Input.GetKey ( KeyCode.A ) && diff.sqrMagnitude > Mathf.Pow ( minimumDistance, 2 ) ) 28 { 29 this.transform.position = Vector3.MoveTowards (this.transform.position, target.transform.position, zoomSpeed * Time.deltaTime ); 30 } 31 // Sキーで対象物から遠ざかる 32 else if ( Input.GetKey ( KeyCode.S ) ) 33 { 34 // カメラを挟んで、物体とは反対側の座標 35 // var otherSide = target.transform.position - diff * 2; 36 var otherSide = this.transform.position - diff; 37 38 transform.position = Vector3.MoveTowards ( transform.position, otherSide, zoomSpeed * Time.deltaTime ); 39 } 40 41 // 左右キーで対象物の周りを回転する 42 if ( Input.GetKey ( KeyCode.LeftArrow ) ) 43 { 44 transform.RotateAround ( target.transform.position, Vector3.up, rotateSpeed * Time.deltaTime ); 45 } 46 else if ( Input.GetKey ( KeyCode.RightArrow ) ) 47 { 48 transform.RotateAround ( target.transform.position, -Vector3.up, rotateSpeed * Time.deltaTime); 49 } 50 } 51}

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

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

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

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

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

guest

回答1

0

ベストアンサー

var diff = target.position - transform.position;
var otherSide = target.position - diff * 2;
ということは
var otherSide = target.position - (target.position - transform.position) * 2;

var otherSide = target.position - target.position*2 + transform.position* 2;

var otherSide = - target.position + transform.position*2;

var otherSide = transform.position - target.position + transform.position;

var otherSide = transform.position - (target.position - transform.position);
つまり
var otherSide = transform.position - diff;

よってプログラムに関係無く(数学的な論理だけで)「var otherSide = this.transform.position - diff;と書き換えて問題無い」と言えます。

元のコードは、target.positionを起点にして、diff * 2の距離遠ざけていますが、何か意図はありますか?

正解は筆者にしか分からないことですが、「Vector3.MoveTowards=A地点からB地点の間にある地点Cへ移動する」という意味なので、「回転の中心に対して反対方向に移動する」というのが「遠ざかる」というイメージに近い為にそうしているのではないでしょうか。

(編集)改めて考えましたが仰る通りthis.transform.position - diff;の方が「自分の位置から見て、回転の中心とは反対方向」に合ってますね。target.position - diff * 2は「回転の中心から自分の位置までの2倍の距離にある位置」とでも言いましょうか。
まぁ示しているモノは同じなので好きな方にすればいいと思います。

投稿2019/06/03 04:32

編集2019/06/03 04:50
sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2019/06/03 15:23 編集

ご回答ありがとうございます。 なるほど、そのような数学的手法で検証することができるのですね。 とても勉強になります。 コードが同等であることをご教示いただいたので、直感的に思える 「this.transform.position - diff;」の方で書き換えたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問