艾尔之光中刀光的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
这就是抛物线方程的参数.

原文地址:https://www.cnblogs.com/flytrace/p/2309248.html