顶点着色器粒子运动

时间:2013-12-09 10:21:13

标签: math opengl-es vector-graphics vertex-shader

我想通过一些给定的属性来移动我的粒子。当颗粒达到其使用寿命时,它们应该减速停止

result = a_pos + a_direction * lifetime * mix(a_speed, a_speed_end, normalized_lifetime);
result.w = 1.0;
gl_Position = u_projection * u_model_view * result;

这不会像我希望的那样工作,因为它不考虑先前的移动,所以当normalized_lifetime达到1时,粒子基本上设置为a_pos,因为a_speed_end为0.我该如何解决这个问题?

编辑:更多信息:

a_pos = startposition

a_direction =标准化方向向量

生命周期=粒子的当前生命周期

a_speed,a_speed_end =期望的开始/结束速度

它们应该沿着方向向量移动一条直线,没有CPU更新

2 个答案:

答案 0 :(得分:2)

你想要一个像-a_deceleration*t^2+a_initial*t+a_pos

这样的等式

一点物理学:

初始速度为a_speed
a_speed_enda_speed - a_deceleration*total_life-a_deceleration = (a_speed_end-a_speed)/total_life

所以你的等式变为

result = a_pos + a_direction * lifetime * a_speed 
               + a_direction * normalized_lifetime * normalized_lifetime * (a_speed_end-a_speed);

编辑:查看维基百科中的公式有一个更容易的

result = a_pos + a_direction * lifetime * (a_speed + mix(a_speed, a_speed_end, normalized_lifetime))/2

答案 1 :(得分:0)

感谢棘轮狂热指责我指向正确的方向,帮助了很多!最终的解决方案是首先计算加速度

a_acceleration = (endspeed - startspeed) / total_lifetime;

最终的公式是:

pos = a_pos + ((0.5 * a_acceleration * current_lifetime * current_lifetime) + (a_start_speed * current_lifetime)) * a_direction;
pos.w = 1.0;
gl_Position = u_projection * u_model_view * pos;

例如,当startpeed为5,endpeed为0且寿命为5时,粒子将缓慢减速并在5秒后完全停止。