今天想達成一個攝影機的效果,就是當有特定的物體越來越接近畫面邊緣時,就要動態的增減Camera的FOV,讓該特定物體不要跑出畫面。
解法
大致上很簡單,只有兩個步驟:
- 求出物件距離畫面邊緣的距離
- 利用Mathf.Lerp達成相對應的FOV調整
先利用Camera.WorldToViewportPoint( Vector3 )求出物件在畫面上的位置,返回的是normalized value(0至1之間),如此就能得知物件相對於畫面邊緣的距離,0代表是在畫面左方邊緣,1則是在畫面右方邊緣。
再來則是利用Mathf.Lerp來調整FOV,Lerp實際上的運作是
public static float Lerp(float start, float end, float value) { return ((1.0f - value) * start) + (value * end); }在其3個arguments中,value是一種類似權重的概念,當他為0時返回的值會是start,為1時返回的即是end,為中間的數值時就是返回按照比例計算後的結果。
因此我只要把WorldToViewportPoint求得的值,以想要的數值範圍作normalize後,讓距離變成0至1之間的數值,傳入Lerp之中就可達成動態FOV的效果。範例如下:
// amount : Value between 0 and 1 indicating the weight of value2. // 為距離螢幕邊緣比重的值 Camera.fieldOfView = Mathf.Lerp( float CameraMinFOV, float CameraMaxFOV , float amount );
參考資料
- Mathfx - The following snippet provides short functions for floating point numbers.
http://wiki.unity3d.com/index.php?title=Mathfx - Camera.WorldToViewportPoint
http://docs.unity3d.com/Documentation/ScriptReference/Camera.WorldToViewportPoint.html - Mathf.Lerp
http://docs.unity3d.com/Documentation/ScriptReference/Mathf.Lerp.html
延伸閱讀
- FOV Formula
http://www.panohelp.com/lensfov.html - Dynamic Perspective FOV (by FOV Fornula way)
http://inburst.io/dynamic-perspective-fov/
沒有留言:
張貼留言