2013年6月6日 星期四

[Unity] Dynamic Camera FOV

遭遇情境

  今天想達成一個攝影機的效果,就是當有特定的物體越來越接近畫面邊緣時,就要動態的增減Camera的FOV,讓該特定物體不要跑出畫面。

解法

  大致上很簡單,只有兩個步驟:

  1. 求出物件距離畫面邊緣的距離
  2. 利用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 );


參考資料


延伸閱讀

沒有留言:

張貼留言