Screen, Viewport 和 Rect 浅析
前言
最近研究Camera時被Screen, Viewport 和 Rect 三者的關(guān)系搞得有點暈,所以臨時決定總結(jié)一下它們之間的關(guān)系。
概念
Screen Space & Viewport Space
以下是來源于Unity Scripting API中Camera類的原文
A Camera is a device through which the player views the world.
A screen space point is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight). The z position is in world units from the Camera.
A viewport space point is normalized and relative to the Camera. The bottom-left of the Camera is (0,0); the top-right is (1,1). The z position is in world units from the Camera.
A world space point is defined in global coordinates (for example, Transform.position).
我個人對它的理解如下:
相機(jī)是一種玩家用來觀察游戲世界的設(shè)備。
Screen space 和 viewport space 都是關(guān)聯(lián)于某個特定的相機(jī)的局部坐標(biāo)系,而 World space 則是全局坐標(biāo)系。
Screen Space(屏幕空間)中的點以像素為單位。屏幕的左下角坐標(biāo)為(0, 0),右上角坐標(biāo)為(pixelWidth, pixelHeight)。z方向的坐標(biāo)為以相機(jī)為原點的相對坐標(biāo)。
pixelWidth和pixelHeight都屬于Camera對象的屬性。盡管Screen space 和 Viewport space只需要二維向量表示相對位置,但為了將它轉(zhuǎn)換為World space中的點我們必須將z軸坐標(biāo)設(shè)置為與相機(jī)之間的距離,否則會出錯。
Viewport space(視窗空間)中的點都是歸一化坐標(biāo)并且相對于具體的相機(jī)。相機(jī)的左下角坐標(biāo)為(0, 0), 右上角坐標(biāo)為(1, 1)。z方向的坐標(biāo)為以相機(jī)為原點的相對坐標(biāo)(這點與Screen space一致)。
當(dāng)我們需要根據(jù)相機(jī)覆蓋范圍動態(tài)選擇其中的一塊區(qū)域時(例如取相機(jī)拍攝畫面的一半),Viewport space坐標(biāo)系下的坐標(biāo)會很有幫助,因為無論相機(jī)拍攝多大的畫面(pixelWidth * pixelHeight),歸一化后都會變?yōu)?1*1)。
Rect
Unity Scripting API中的描述:
A 2D Rectangle defined by X and Y position, width and height.
看起來Rect十分的簡單,實際上確實也是這樣。他就相當(dāng)于定義了一個2D的長方形,我們可以通過Rect對象的屬性訪問到它的width, height以及其他的屬性。
雖然Rect的定義很簡單,但是讓人頭疼的是Unity使用了很多中2D 坐標(biāo)空間,大多數(shù)都定義為x軸向右遞增,y軸向上遞增,即左下角為(0, 0);但是在GUI和GUILayout類中,y軸卻是向下遞增的,即左上角為(0, 0),因此在我們需要自己定義Rect時一定要明確調(diào)用函數(shù)的2D坐標(biāo)空間是怎么樣的。
坐標(biāo)空間的轉(zhuǎn)換
- 在Camera對象里包含了兩個字段:rect 和 pixelRect,它們分別定義了Camera對象的Viewport Space 和 Screen Space 的取值范圍。這里要注意的是Viewport Space和Screen Space 都屬于常規(guī)的2D坐標(biāo)空間,即以左下角為(0,0)。如果我們在Camera 坐標(biāo)空間中的取值超過了rect 和 pixelRect 的取值范圍, Unity就會報錯。
當(dāng)然,每個Camera對象也提供了公共方法幫助我們實現(xiàn)Screen,Viewport 和 World三種空間中坐標(biāo)的轉(zhuǎn)換,可以使用的函數(shù)包括:
函數(shù)描述 ScreenToViewportPoint Transforms position from screen space into viewport space. ScreenToWorldPoint Transforms position from screen space into world space. ViewportToScreenPoint Transforms position from viewport space into screen space. ViewportToWorldPoint Transforms position from viewport space into world space. WorldToScreenPoint Transforms position from world space into screen space. WorldToViewportPoint Transforms position from world space into viewport space. 這些函數(shù)均為接收一個Vector3變量(原始空間坐標(biāo)),返回一個Vector3變量(目標(biāo)空間坐標(biāo)),并且只能通過Camera示例對象調(diào)用。
總結(jié)
以上是生活随笔為你收集整理的Screen, Viewport 和 Rect 浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原创】关于not in的一些事情
- 下一篇: 关于TI CCS版本的一些个人观点