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