はじめに
オブジェクトの見た目の大きさは変えずにカメラからの距離だけ変えたい、という状況に出くわしたので考え方の整理もかねて記事にしてみました。
ちなみに、gifアニメーションはProcessingを使って作っています。
考え方
Perspectiveカメラ(透視投影)
近くのものは大きく、遠くのものは小さく見えるように視錐台を使って画面上へ投影する手法
カメラから離れても見かけ上の大きさが変化しない立方体
問題を簡単にするため、立方体を使って考えます。
立方体とカメラの距離が1の場合の立方体の1辺の長さをL
としたとき、
カメラからの距離がd
の場合の辺の長さをd * L
にすると画面上の像が同じ大きさになります。(相似)
以上を踏まえてスクリプトに落とし込んでいきます。
見かけ上の大きさを一定にするスクリプト
NewBehaviourScript.cs
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
// カメラからの距離が1のときのスケール値
Vector3 baseScale;
void Start()
{
// カメラからの距離が1のときのスケール値を算出
this.baseScale = this.transform.localScale / this.GetDistance();
}
void Update()
{
this.transform.localScale = this.baseScale * this.GetDistance();
}
// カメラからの距離を取得
float GetDistance()
{
return (this.transform.position- Camera.main.transform.position).magnitude;
}
}
実行してみる
立方体を動かしてもカメラから見た立方体の大きさは変わっていないことが見て取れますね。(完