unityで今表示しているカメラの位置で画面と同じ大きさのオブジェクトを作りたいと考えています。
当然、カメラからの距離によっても、画面の解像度によっても大きさは変わってくると思うのですが、
どのように計算して、オブジェクトの大きさを割り出せばよいのか考え方がわかりません。
オブジェクトを画面いっぱいに表示するために、カメラの位置を調整するというわけではなく
カメラの位置を基準にしてオブジェクトの大きさを調整する方法を教えてください。
オブジェクトは3dだ、キューブや、プレーン、クアッドなどのイメージです
よろしくお願いいたします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
3Dオブジェクトですか? 2D(uGUI)オブジェクトですか?
「カメラの位置で」とありますが、3Dの場合カメラと全く同じ位置にすると映らない(Clipping PlanesのNearより近くは映らない)のですが、ずらしてOKですか?

回答1件
0
ベストアンサー
画角(field of view、FOV)から算出するのがいいと思います
オブジェクトの大きさは画角をΘ、距離をdとすると
dsin(Θ0.5)になるので関数電卓でも使えば求まるとおもいます
投稿2018/12/17 10:54
総合スコア2050
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
すみません。ちょっとよくわからないのですが
例えばFovが60の場合、画面の縦と横のサイズは違うと思うのですが
画面サイズを考慮すると、どのような計算式になるのでしょうか。
また、QuadやPlaneなどのオブジェクトの場合、大きさはScaleで指定すると思うのですが
上記の計算結果で得られた結果をそのままScaleに指定すると画面いっぱいに広がったオブジェクトになるのでしょうか。。
追記:
スクリプト上で動的にやるならこんな感じです
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
}
fieldOfviewは縦の画角です
横に合わせたければ横縦比をかければできます
公式:
Description
The field of view of the camera in degrees.
This is the vertical field of view; horizontal FOV varies
画面にピッタリ合わせたければ横は横、縦は縦の比で計算すれば画面いっぱいになります。
回答ありがとうございます。
試してみたのですが、うまくいきません。
メインカメラの位置を 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;
}
ごめんなさいwidthはcubeの大きさなのでデフォルトのCubeだったら1か2になると思います
ありがとうございます。
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);
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;
ごめんなさいdegreeからradianに変換するのを忘れてたので直しました。
横方向の画角を計算するには一旦角度を傾きに変換して横縦比で割ってATanで角度に戻す必要があります。
やっとできました!
細かく教えて頂きありがとうございます!

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。