第三人稱攝像機(jī)
這里例子的相機(jī)類似空戰(zhàn)吧,和AGA也不是很像。
攝像機(jī)的實現(xiàn)總體大差不差,這里通過這個案例說一些點(diǎn)。

1. 保持角色在相機(jī)內(nèi),并且有合適的大小。
????這里用到的參數(shù)有兩個:角色與相機(jī)的相對角度、角色與相機(jī)的距離。
????????這里求得角色與鏡頭的相對角度。
????????需要說一下,由于角色總會在鏡頭視錐體內(nèi),相對于鏡頭正方向,不會有大角度。
????????因此做的只是簡單的處理。下文看向綠球(target)部分會有完整的處理。
????????求角色與相機(jī)距離有兩種標(biāo)準(zhǔn),一種就是3D空間內(nèi)兩點(diǎn)的距離,這里用另一種,角色所在平面與鏡頭所在平面距離。兩個平面都是攝像機(jī)的視錐體切面。
??? ????這里用之前發(fā)的矩陣的方式計算的,直接把角色位置給鏡頭轉(zhuǎn)相機(jī)空間位置并取z即可。
2. 插值
????直接為變換賦值總是生硬的,使用插值是最常用的柔和化方式。
????這里的插值使用上文計算出的參數(shù),實現(xiàn)讓上文目標(biāo)。
????首先,實現(xiàn)讓鏡頭嘗試將角色保持在視錐體內(nèi)。
????這里需要解釋視錐體的尺寸由camera組件的FOV Axis、Field of View和屏幕比例共同決定。
????這里的邊界是一個縮小版的視錐體切面,是一個到達(dá)矩形的四條邊時產(chǎn)生變換的實現(xiàn)。
????如果想要實現(xiàn)觸碰到圓形、橢圓型等其他幾何圖形的邊界而發(fā)生變換,可以將“角色”的世界位置轉(zhuǎn)為屏幕位置,然后代入相應(yīng)圖形的公式即可。
保持距離
這里要說明的是“角色”對象在鏡頭跟隨時可能會產(chǎn)生“闖動”一樣的閃爍。
下文的Lerp是一種先極快后極慢的插值,如果插值運(yùn)算總是插值幾幀、不動幾幀,實機(jī)中就會表現(xiàn)為這樣的閃爍。
將插值開始時的速度設(shè)定的很慢,并且使插值基本不會滿速,可以很大程度避免這種情況。
最后,要實現(xiàn)鏡頭的旋轉(zhuǎn),對于LookAt盡量不去使用,鏡頭很少應(yīng)用z軸上的旋轉(zhuǎn),運(yùn)算也會變得復(fù)雜。
這里實現(xiàn)了一個插值的LookAt。
角度的運(yùn)算忠實的求兩條線段組成的角的夾角,如果不去else if 反向方向的線段,那么就需要有這樣的運(yùn)算。
正確的角度

需要調(diào)整的情況

