1. 程式人生 > >unity3d 攝像機抖動情況和解決方案彙總

unity3d 攝像機抖動情況和解決方案彙總

     用unity3d 如果你沒有碰到攝像機抖動的問題,那麼你是幸運的。我相信如果你的攝像機控制比較複雜,或者人物移動比較複雜,或多或少總會有這樣的疑惑:攝像機好像再抖,或許是模型在抖。總之就是各種抖。當你以為發現問題並解決了,一切都很好,突然有一天,它又開始抖了,而且不止一次這樣。我就碰到過這種情況,特此做下總結。

    首先你要理解攝像機什麼情況下會給你抖動的感覺,簡單來說你如果想讓攝像機抖動,那麼肯定是讓攝像機不停變換位置,而且是無規則的。說白了,就是不規則的速度變化會引起抖動。注意這裡是相對速度,因為如果絕對速度在變化,但相對速度是一致的,其實你看到的物體是不抖的。這一點在後面的一種情況會用到。接下來就分析下各種情況和原因以級解決方案。

1.攝像機控制很簡單,卻有大幅度的抖動。

這種情況其實一般不是攝像機控制的問題,而是你攝像機所看物體的策略的問題。首先你要確保攝像機是沒幀都更新位置的,你可以放在Update()函式中或者LateUpdate()函式中,切忌不要放在FixedUpdate中去更新位置,因為FixedUpdate不保證沒幀都執行,這樣就會有斷續的現象。然後你要確保攝像機看向的物體的移動是正常的,就是說物體不是在那裡抖動的,但攝像機卻沒有一起抖,這可能和你的邏輯有關。不過這種情況並不常見。大部分時候,相信簡單的攝像機控制是最能保證穩定的畫面的。

2.攝像機控制簡單,大部分時候不抖動,偶爾抖一下,時斷時續。

這種情況非常令人困惑,因為理論上應該是不會抖動的,甚至很多時候你要懷疑是不是unity3d自己的問題或者我的幀數不穩定引起的?這裡我首先要非常明確一點:Unity3d是一個成熟的商業產品,如果你能夠確保正確使用裡面的元件和寫下正確的程式碼,那麼是不會有這些問題的,包括攝像機抖動和其他一些常見的問題。你首先要看自己的程式碼和用法是否有問題。

這種情況的原因可能會比較多,我這裡只列舉我自己碰到的。第一種是因為不必要的平滑演算法引起的。你可能會覺得奇怪,平滑演算法難道不是為了攝像機不抖而存在的嗎?怎麼反而會引起攝像機抖動。甚至有的時候你感覺攝像機抖,然後加了平滑演算法就不抖了。這裡我要解釋一下,也是一開始說的,攝像機抖動是基於相對速度的變化不穩定。那麼假設你的攝像機本身控制比較簡單,其實我們可以基本肯定相對變化速度是一致的。比如你攝像機就是看著一個人,這個去哪攝像機看哪,那麼是不是說兩人相對速度其實為0。然後你說人抖動怎麼辦?那麼攝像機會一起抖,只不過由於他們相對速度為0,所以你看人是不抖的,但是如果你有場景作為背景,那麼你會感覺地面有點抖。這是必須權衡的,因為在場景和人物不同步的情況下,肯定會有一個相對穩定而另一個相對抖動,一般我們和人物一致就好了,畢竟人的視覺肯定是聚焦人物的。那麼在這樣的基礎上,我加了平滑演算法,會怎麼樣呢?平滑無非兩種,一種是延遲,一種是根據以前的速度進行加速度計算,然速度變化變慢。不論哪種,在攝像機控制簡單的情況下都是畫蛇添足。因為首先你已經確保了人和攝像機之間的穩定性。你卻加了這種演算法,導致了他們不再穩定,而且同時你也無法彌補場景那邊被犧牲的抖動,可能反而更抖了。那麼照這麼說,平滑演算法豈不是沒用?不是的,後面的情況你會看到平滑演算法的引用。只是在攝像機規則很簡單的情況下,並不需要額外的平滑演算法。

這裡還有個小細節,就是你的攝像機一定要先設定好位置,再LookAt,如果你先LookAt,再設定攝像機的位置的話,那麼你的攝像機其實LookAt了另一個地方了。這也是引起抖動的原因之一。

3.攝像機控制比較複雜,有時經常抖動,有時候又不抖,神經病一樣的。

這種情況就開始複雜起來了。首先我建議你將攝像機改成簡單的規則,看是否有抖動。有的話參考1和2裡面的先處理。

如果你發現規則簡單的時候是不抖動的,但規則複雜的時候抖動,那麼你就要好好看看你的規則的程式碼了。如果你的攝像機移動有速度的概念,一定要將速度和Time.dealtTime聯絡在一起。也就是這一幀跑了多久時間,這是很重要的,因為每一幀的時間不同,你如果採用相同的位移,其實會引起不同的速度感。

其次,你要明確你的移動演算法是基於勻速的,不論是移動還是旋轉,都應該是勻速的(也許也可以基於某種速度變化規則,但務必是有規則的運動)。這裡特別要注意勻速運動如果到了終點之前,其實是要一個減速的,不然就會過頭,過頭的話下一幀可能需要回到正確的位置,就會回退了,如此反覆,也會抖動。

第三,不建議用ITween這種外掛控制攝像機運動,因為它內部的程式碼其實並沒有考慮這些,所以你用ITween導致攝像機抖動是很正常的。當然你圖方便然後覺得抖就抖吧那倒是無所謂。

最後,如果還是找不到原因,就排除法,一句句註釋掉程式碼,看到底是哪一句引起了抖動,然後再仔細分析原因。

4. 從正常的邏輯角度來講攝像機確實會抖動,客觀原因。

這種情況也不多,但確實存在。比如你的攝像機的規則是對準多個目標的中心,或者還和力啊,人的轉向啊,人的速度變化很突然啊等等有關。如果本身的設計就是導致攝像機抖動的原因,那麼這個時候就是平滑演算法的用途了,平滑演算法本身就是為了讓本來變化的不穩定的速度趨於穩定。具體平滑演算法有時間再寫吧。今天要睡覺了。