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

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

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

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

Q&A

解決済

1回答

1309閲覧

UNITY オブジェクトの大きさを設定したい

Qoo

総合スコア1249

Unity

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

0グッド

0クリップ

投稿2018/12/17 07:14

編集2018/12/17 09:28

unityで今表示しているカメラの位置で画面と同じ大きさのオブジェクトを作りたいと考えています。

当然、カメラからの距離によっても、画面の解像度によっても大きさは変わってくると思うのですが、

どのように計算して、オブジェクトの大きさを割り出せばよいのか考え方がわかりません。

オブジェクトを画面いっぱいに表示するために、カメラの位置を調整するというわけではなく

カメラの位置を基準にしてオブジェクトの大きさを調整する方法を教えてください。

オブジェクトは3dだ、キューブや、プレーン、クアッドなどのイメージです

よろしくお願いいたします

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

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

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

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

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

sakura_hana

2018/12/17 09:23

3Dオブジェクトですか? 2D(uGUI)オブジェクトですか? 「カメラの位置で」とありますが、3Dの場合カメラと全く同じ位置にすると映らない(Clipping PlanesのNearより近くは映らない)のですが、ずらしてOKですか?
guest

回答1

0

ベストアンサー

画角(field of view、FOV)から算出するのがいいと思います
オブジェクトの大きさは画角をΘ、距離をdとすると
dsin(Θ0.5)になるので関数電卓でも使えば求まるとおもいます

投稿2018/12/17 10:54

bochan2

総合スコア2050

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

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

Qoo

2018/12/17 11:04

すみません。ちょっとよくわからないのですが 例えばFovが60の場合、画面の縦と横のサイズは違うと思うのですが 画面サイズを考慮すると、どのような計算式になるのでしょうか。 また、QuadやPlaneなどのオブジェクトの場合、大きさはScaleで指定すると思うのですが 上記の計算結果で得られた結果をそのままScaleに指定すると画面いっぱいに広がったオブジェクトになるのでしょうか。。
bochan2

2018/12/17 11:06

追記: スクリプト上で動的にやるならこんな感じです public Camera cam;//カメラ public Transform obj;//物体 public float width;//物体の幅 void Update(){ obj.localScale=Vector3.One* Vector3.Distance(obj.position,cam.transform.position)*Mathf.Sin(cam.fieldOfView*0.5f)/width }
bochan2

2018/12/17 11:08

fieldOfviewは縦の画角です 横に合わせたければ横縦比をかければできます 公式: Description The field of view of the camera in degrees. This is the vertical field of view; horizontal FOV varies
bochan2

2018/12/17 11:13

画面にピッタリ合わせたければ横は横、縦は縦の比で計算すれば画面いっぱいになります。
Qoo

2018/12/17 11:32

回答ありがとうございます。 試してみたのですが、うまくいきません。 メインカメラの位置を 0,0,-10 fov60 Cubeを 位置0,0,0 Scale(1,1,1) で配置して、Startで画面のスクリーンサイズを取得するように してみましたが、キューブは画面いっぱいにならず、縦にも横にも合わず むしろ1より小さくなってしまいます何が悪いのでしょうか。。 public Camera cam;//カメラ public Transform obj;//物体 public float width;//物体の幅 public float height;//物体の高さ void Start() { width = Screen.width; height = Screen.height; Debug.Log(width + "-" + height); } void Update() { obj.localScale = Vector3.one * Vector3.Distance(obj.position, cam.transform.position) * Mathf.Sin(cam.fieldOfView * 0.5f) / width; }
bochan2

2018/12/17 11:34

ごめんなさいwidthはcubeの大きさなのでデフォルトのCubeだったら1か2になると思います
Qoo

2018/12/17 13:16

ありがとうございます。 1に設定すると大きくはなったのですが、縦横を合わせる方法について すみません、、理解ができず何度も申し訳ないのですが、 >画面にピッタリ合わせたければ横は横、縦は縦の比で計算すれば画面いっぱいになります。 これはアスペクト比と計算する必要があるということでしょうか? 単純に横画面の場合、幅/高さでよいのでしょうか。 下記の処理の理解ができないのですが、 Vector3.oneにVector3.Distanceをかけるとx,y,zそれぞれに乗算されるという理解でよいのでしょうか obj.localScale = Vector3.one * Vector3.Distance(obj.position, cam.transform.position) * Mathf.Sin(cam.fieldOfView * 0.5f) / width; 横は横、縦は縦で計算する場合はこんな感じであっているのでしょうか obj.localScale = new Vector3( Vector3.one.x * (Vector3.Distance(obj.position, cam.transform.position) * Mathf.Sin(cam.fieldOfView * 0.5f) / width), Vector3.one.y * (Vector3.Distance(obj.position, cam.transform.position) * Mathf.Sin(cam.fieldOfView * 0.5f) / height), Vector3.one.z);
bochan2

2018/12/18 00:08

float vFov=cam.fieldOfView*Mathf.Deg2Rad*0.5f; float htan=Mathf.Tan(vFov)/cam.aspect; float hFov=Mathf.ATan(htan); float distance=Vector3.Distance(obj.position, cam.transform.position); obj.localScale=new Vector3(1/width*Mathf.Sin(hFov) 1/height*Mathf.Sin(vFov),1)*distance;
bochan2

2018/12/18 00:10

ごめんなさいdegreeからradianに変換するのを忘れてたので直しました。 横方向の画角を計算するには一旦角度を傾きに変換して横縦比で割ってATanで角度に戻す必要があります。
Qoo

2018/12/20 15:16

やっとできました! 細かく教えて頂きありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問