艾爾之光中刀光的ogre實現


模擬艾爾之光的刀光,很相似.

    1 實現隨時間或幀速的控制.

    參照ogre中的關於軌跡的一個實現:RibonTrail.該實現對於軌跡面片使用類似公告板的技術,面始終朝向攝像機.這不是我們需要的效果.我們需要刀光面片能夠沿着刀面的方向展開.所以請忽略它的畫法,使用它的整個邏輯結構即可,包括監聽節點,面片顏色和寬度隨時間的變化.面片使用manualobject或者vertexdata直接構造.使用manualobject記得加上setdynamic函數.我使用1d紋理.

    2 插值算法.

    我一開始使用三次插值.確實非常精確.可這並不是我們想要的.因為幀率的原因,你監聽節點或隨時間控制刀光更新時,並不是能無限細分的.極端點你debug時甚至只能看到6-7個更新點,意味着刀光轉一圈你只能看到一個六邊形.三次插值能圓滑邊與邊的的銜接點.可是如果2點之間跨度大的話,邊仍然是直的.所以我們要做的是降低精確性,反映在公式里就是降低插值次冪,改為2次插值.那就直接是個拋物線了.不要擔心拋物線很奇怪,實際實現起來效果很好.實現過程中亦嘗試了其他插值,發現還是簡單一點比較好.

    3 shader或紋理.

       實現邊緣白光和刀光透明的效果.實際上可以直接使用一張1d的紋理.在一個方向上逐漸加深顏色,在尖端處流出空白即為白光.我自己這里是使用了shader尋找一個1d紋理得到階梯值來制作白光.只是為了好玩,最近在學shader.

  

  若不想自己寫,google搜索swordtrail,應該有個老外寫了對應的使用面片構造刀光的代碼.小改一下即可,需要自己添加.

      注意隨時間變化調整插值過程的速度參數可防止產生類似水波曲線.

      最好綁定到2個節點,效果會好很多.

  

  一些可能的變化: 

    嘗試使用2d紋理,可能做出更特別的效果.

    插值算法可采用圓弧逼近.但實現比較困難,特別是當出現連續逆方向的拐點時,很難處理.

 

 

拋物線方程如下:
y = a*x^2 + b*x + c
它的導數方程:
y = 2*a*x + b
令過去點為start,假設當前點為end.因為我們是做插值,x的值被規約到[0, 1]中.將0, 1代入方程1,得到:
start = c
end = a + b + c
還差一個方程才能解除a,b,c與start,end的關系.因為一般來說當前點的速度矢量你是知道的,令其為vs,代入導數方程:
vs = b
解得:a = end - start - vs
c = start
b = end
這就是拋物線方程的參數.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM