2013-12-09 4 views
1

Я хочу переместить мои частицы несколькими атрибутами. Частицы должны замедлиться до остановки, как они достигают конца своей жизниДвижение частиц вершинного шейдера

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. Как мне это сделать?

EDIT: Дополнительная информация:

a_pos = StartPosition

a_direction = нормализованное направление вектора

срок службы = текущее время жизни частицы

a_speed, a_speed_end = желаемого начала/конца скорости

Они должны двигаться по прямой вдоль вектора направления, без обновлений ЦП

+0

Как перемещаются ваши частицы? По прямой? Случайно? Включены ли обновления процессора? –

+0

Какую версию OpenGL вы настраиваете? – genpfault

+0

iOS OpenGL ES 2.0 – cboe

ответ

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 
+0

Это не работает. Кажется, они немного замедляются, но, конечно же, не останавливаются в конце своей жизни. Я включил более подробную информацию о переменных выше! Спасибо за помощь в любом случае, я не очень разбираюсь в физике, что называется формулой выше? – cboe

+0

Это смещение с постоянным ускорением [см. Wiki для точных форм] (http://en.wikipedia.org/wiki/Acceleration#Uniform_acceleration) –

+0

Я думаю, что формула правильная, но цифры неверны. То, что я хочу, например, для частицы, чтобы двигаться в течение 5 секунд с замедлением скорости, и, достигнув этих 5 секунд, он должен остановиться, поэтому мне нужно будет рассчитать соответствующее ускорение сначала, я думаю ... – cboe

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; 

Например, с startspeed 5, endspeed 0 и время жизни 5 частица будет медленно замедляться и дойти до полной остановки через 5 секунд.

Смежные вопросы