我想通过一些给定的属性来移动我的粒子。当颗粒达到其使用寿命时,它们应该减速停止
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更新
答案 0 :(得分:2)
你想要一个像-a_deceleration*t^2+a_initial*t+a_pos
一点物理学:
初始速度为a_speed
a_speed_end
为a_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秒后完全停止。