由于最近想做一个用粒子替换实现射箭的特效,一时摸不着头脑。
粒子替换实现射箭的效果的最大问题在于,如果用粒子的速度velocity作为instancer的Aim Direction,那么一旦粒子与地面产生碰撞(这里我们碰撞属性中的摩擦力Friciton设置为1,弹力Resilience设置为0),势必导致速度瞬时变为0,使得箭无法插在地面上,而是一碰到地面就倒下。
于是网上找了一下相关教程特别是G_no_mon的在线教程给了我很多提示。国内大部分相关教程也是翻译的那个版本,该教程提供的解决方案是使用了一个JMS的脚本,先是通过记录粒子的运动轨迹生成若干条曲线,然后将曲线上的的末端的一些点给删除了(也就是粒子碰撞地面后生成的轨迹点),最后让剑沿着这些曲线做“路径动画”。从而实现乱箭射在地面上(或是其他物体)的效果。
研究过程中觉得用JMS脚本来一遍一遍的计算生成曲线有些浪费时间,而且对于我们这些MEL初学者来说,还的另外花些时间研究下JSM(当然了,学习是必须的)。只是我从原来的教程中得到些启发觉得可以用更为简单的方法去实现这一射箭的效果。
现讲一下我的大概想法,既然我们不能直接用velocity作为instancer的Aim Direction,那么我们可以自定义一个变量用来存储粒子在碰撞前一帧,速度还没变为0的那个速度值,用该矢量速度值作为箭插在物体上的方向。
为了完整起见,我把整个制作过程详细介绍一下:
1.先制作一只简单的箭

2.制作一个地面,和一个用来发射箭的面

3.选择用来发射箭的那个面,通过Particles > Emit form object,从该面上发射粒子

4.打开粒子发射器属性:
Emitter Type :Surface
Rate(particles/Sec): 5
Speed : 20
Speed Random: 4

5.给粒子加个重力场

6.选中粒子和地面,打开菜单命令Particles > Make Collide 后面的属性对话框,将弹力resilience设置为0,摩擦力friction设置为1,点击Create生成碰撞事件

7.执行Play场景,看到粒子与地面产生正确的碰撞,并停止在地面上(如果地面凹凸不平,会有滑动,不妨,这个我们稍后解决)

8.先选弓箭再选粒子,打开菜单命令Particles > Instancer

9.打开粒子属性中的Instancer一栏,勾启Allow All Data Types,AimDirection设置velocity,此时播放我们就会发现剑一射中就立马“爬”下了
