モデルが画面外に出たことを検知したり、画面いっぱいにPlaneを広げたりしたい場合、画面四隅のワールド座標がわかると案外便利です。
そこで、この記事では画面四隅のワールド座標を取得する方法を説明します。
ワールド座標変換
画面四隅のワールド座標を取得するには、画面四隅のスクリーン座標をワールド座標に変換します。Unityでスクリーン座標をワールド座標に変換するにはScreenToWorldPointメソッドを使用します。
ScreenToWorldPointは引数にスクリーン座標をとり、これをワールド座標に変換するメソッドです。画面四隅のスクリーン座標はそれぞれ、
- (0,0)
- (Screen.Width, 0)
- (0, Screen.Height)
- (Screen.Width, Screen.Height)
なので、これをScreenToWorldPointに渡せば、画面四隅のワールド座標が得られます。
ただし、変換するときに、カメラからの奥行きによって四隅のワールド座標が変化するので、引数のz値にカメラからの距離(depth)を指定する必要があります。
画面右上(Screen.Width, Screen.Height)と左下(0, 0)のワールド座標を取得するスクリプトは次のようになります。ここではdepth=5.0として、カメラから5m先のワールド座標がを取得しています。
float depth = 5.0f; rightTop = Camera.main.ScreenToWorldPoint(new Vector3(Screen.Width, Screen.Height, depth)); leftBottom = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, depth));
カメラがOrthographicの場合
カメラからの奥行きによってワールド座標が変化するのは、カメラのProjectionがPerspectiveのときです。Orthographicのときは下図のようにカメラからの奥行きに関わらずワールド座標は一定なので、depthには0を指定しておいて問題ありません。
カメラがOrthographicのときのスクリプトは次のようになります。
rightTop = Camera.main.ScreenToWorldPoint(new Vector3(Screen.Width, Screen.Height, 0)); leftBottom = Camera.main.ScreenToWorldPoint(Vector3.zero);