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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

5035閲覧

キャンバスの左端とsizeDelta

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2016/10/31 14:47

編集2016/10/31 16:36

###前提・実現したいこと

前回の質問でご教授いただいた内容で、
回答者様から「(_sizeDelta.x / -2f) はキャンバスの左端」で、
「(_sizeDelta.y / -2f」はキャンバスの下端」であるとご教授いただきました。

これらが何故、キャンバスの左端や下端を表すのか理解できていません。
ご教授のほどよろしくお願いします。

※キャンバスはWorld Spaceで扱います。

###該当のソースコード
今回の質問部分を下記のコードに抜粋しました。

C#

1public class CanvasScript : MonoBehaviour { 2 public Canvas canvas; 3 4 // Use this for initialization 5 void Start () { 6 var _canvasRectTf = canvas.GetComponent<RectTransform>(); 7 var _pivot = _canvasRectTf.pivot; 8 var _sizeDelta = _canvasRectTf.sizeDelta; 9 var _pos = Vector3.zero; 10 _pos.x = (_sizeDelta.x / -2f) + (_sizeDelta.x) * _pivot.x; 11 _pos.y = (_sizeDelta.y / -2f) + (_sizeDelta.y) * _pivot.y; 12 13 Debug.Log ("_sizeDelta.x:" + _sizeDelta.x); 14 Debug.Log ("_sizeDelta.y:" + _sizeDelta.y); 15 Debug.Log ("_sizeDelta.x / -2f:" + _sizeDelta.x / -2f); 16 Debug.Log ("_sizeDelta.y / -2f:" + _sizeDelta.y / -2f); 17 } 18}

###試したことと質問。

まず、sizeDeltaについて、下記のように認識しています。

sizeDelta.x → CanvasのWidthの値。 sizeDelta.y → CanvasのHeightの値。

質問①:上記の認識は正しいですか?

認識している理由は、Debug.Logで出力をとったら、
それぞれCanvasのWidthとCanvasのHeightに一致する値が出力された為です。
また、Canvasの位置を変更しても、これらの値は変わりませんでした。

また、マニュアルの説明もあまり理解できませんでした。
アンカーの値を変えれば、sizeDeltaの値が変化するのかと思い、
Canvasのインスペクターで、[Rect Transform]の[Anchors]のMinのX, Y、MaxのX, Yの値を
変えたりしてみましたが、sizeDeltaの出力はCanvasのWidthとCanvasのHeightに一致するままで
変わりませんでした。

質問②:
sizeDeltaは、Canvasの[Rect Transform]の[Anchors]の値によって変化しますか?
変化する場合は、どのような値を設定したときに変化しますか?

質問③:
なぜ、「(_sizeDelta.x / -2f) はキャンバスの左端」で、
「(_sizeDelta.y / -2f」はキャンバスの下端」を表すのですか?
キャンバスの左端とは、キャンバスの左端の座標のことですか?(下端についても同様の質問。)
シーン上でCanvasの位置を変更して、ゲームを実行しても、
_sizeDelta.x / -2f や_sizeDelta.y / -2f の値は変わりませんでした。
質問①のように認識している為、_sizeDelta.x / -2fは、マイナスのCanvasのWidthの半分の値、
_sizeDelta.y / -2fは、マイナスのCanvasのHeightの半分の値に思えてしまいます。

ご教授のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

前回の説明についてですが、Matrix4x4.MultiplyPointにおいての話です。
その値だけを見ても意味はありません。
カメラのビュー座標をワールド座標に変換した行列に、カメラ画面の中心をキャンバスのpivotを考慮した、キャンバスの起点を得る数式です。

1への回答
RectTransform.sizeDeltaはキャンバスのWidthHeightの値です。

2への回答
変わりません。

3への回答
上記に述べた通り、そこの値だけを取り出しても意味はなく、上記のケースにおいてにしかその意味を持ちません。
あくまで、キャンバスをカメラ画面の中心に持ってくるときに、移動前のキャンバスの座標とは関係なく、カメラから見たキャンバスの起点になるローカル座標が必要なので、その起点の座標を得るのにsizeDeltaの値とpivotの値を利用しているだけです。

例として、sizeDelta(2,4)のキャンバスをカメラの中心に移動する場合、
カメラから見た画面の中心が(0,0)で、そこの中心にキャンバスを移動するためには、
移動先のキャンバスの左下の座標が必要になります。
このとき、キャンバスの左端となる座標を求めるには画面の中心(0)からキャンバスの幅の半分(sizeDelta.x / 2f)から引くと求めることができます。
0 - (sizeDelta.x / 2f)(sizeDelta.x / -2f)となります。

pivotの値を考慮する必要があるので、キャンバスの幅にpivotを掛けます。
(sizeDelta.x) * pivot.x

この2つを足すことで座標を求めます。
(sizeDelta.x / -2f) + (sizeDelta.x) * pivot.x;

y座標も同様です。

sizeDeltaの値が変わっていないのは、キャンバス自体のサイズは移動前も後も変わっていないからです。

投稿2016/10/31 17:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/11/01 10:28 編集

前回に引き続き、ご回答ありがとうございます。 (sizeDelta.x / -2f) が中心から見て、左端になることはわかりました。 あまり自信がないのですが、下記の解釈はいかがでしょうか? -------------------------------------------------------------------------------------------------- マトリックスのオブジェクトの起点(今回の場合はカメラの起点)に合わせたい、 移動対象オブジェクトのローカルの位置を位置Aとする。 (マトリックス).MultiplyPoint( )の引数には、 この位置Aから見た移動対象オブジェクトの起点の位置(ローカル座標)を指定すればよい。 今回はカメラの中心(起点)に、キャンバスの中心を合わせたかったので、 キャンバスの中心から見た、pivotを考慮したキャンバスの起点のローカル座標を引数に与えた。 例えば、カメラの中心(起点)にキャンバスの右上の位置を合わせたい場合は、 キャンバスの右上の位置から見た、 pivotを考慮したキャンバスの起点のローカル座標を引数に与える。 そのため、コードは、 _pos.x = (-_sizeDelta.x) + (_sizeDelta.x) * _pivot.x; _pos.y = (-_sizeDelta.y) + (_sizeDelta.y) * _pivot.y; _pos.z = distance; となる。
退会済みユーザー

退会済みユーザー

2016/11/01 11:18

> この位置Aから見た移動対象オブジェクトの起点の位置(ローカル座標)を指定すればよい。 "位置Aから見た"ではなく、"カメラから見た"ローカル座標です。 > 例えば、カメラの中心(起点)にキャンバスの右上の位置を合わせたい場合は、 > キャンバスの右上の位置から見た、 同様に"カメラから見た"です。 > カメラの中心(起点)にキャンバスの右上の位置を合わせたい場合は、 キャンバスの右上をカメラの中心に合わせたい場合はその式でOKです。
退会済みユーザー

退会済みユーザー

2016/11/01 12:22

何度もすみません。 "カメラから見た"とは、対象オブジェクトの移動前ではなく、 "対象オブジェクトの移動後の状態を想像して、その状態のカメラから見た"、 そのオブジェクトの起点を指定するという解釈で大丈夫ですか?
退会済みユーザー

退会済みユーザー

2016/11/01 13:20

カメラは何も操作していないので、"その状態"というのが何を指しているのか分かりませんが、 キャンバスを移動するのに必要な情報はキャンバスの大きさ、pivotの値のみです。移動前のキャンバスの座標は関係ありません。 カメラ(カメラ画面)から見てどの位置にキャンバスを移動したいか、という話なので distance = -10f; のとき、 _pos = new Vector3(0f,0f,distance); とすればカメラ(カメラ画面)からz軸方向-10fの位置にキャンバスが移動しますが、キャンバスの大きさ、pivotの値を考慮していないため、キャンバスの中心とカメラの画面の中心が一致しません。 それを一致させるのに例の式を用いる、ということです。
退会済みユーザー

退会済みユーザー

2016/11/01 14:29 編集

すみません、これが本当に最後の質問にしたいと思います。 例の式(_pos)の作り方は、「カメラから見た移動先のキャンバスのpivotを考慮した起点の座標(ローカル座標)」という考え方で合っていますか?
退会済みユーザー

退会済みユーザー

2016/11/01 14:33

その考え方で問題ありません。
退会済みユーザー

退会済みユーザー

2016/11/01 15:06

ご回答ありがとうございます。 私の理解力が無い為、何度も質問してすみませんでした。 ずっとイメージがわからず悩んでたので、とても勉強になりました。 最後までご丁寧にご教授いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問