JS - Как я могу реализовать гравитацию?

Как я могу реализовать гравитацию? Я сделал это: http://jsfiddle.net/X2XvC/5/, но все точки просто следуют ваш курсор (это не гравитация). Я слышал о методе Эйлера, но не знаю, как реализовать его в своем коде.

что я нашел:

void update(float dt)
{
    position += velocity * dt + acceleration * 0.5 * dt * dt;
    velocity += acceleration * dt;
}

person Community    schedule 13.07.2013    source источник
comment
Вы должны воздействовать на значения скорости Y вашей точки силой гравитации. На каждой итерации скорость Y должна уменьшаться (менее положительной) на некоторую величину, а сама величина должна увеличиваться с течением времени для каждой точки. Подумайте об основах физики реальной гравитации :)   -  person Pointy    schedule 14.07.2013
comment
Посмотрю, что я могу сделать :)   -  person    schedule 14.07.2013
comment
Да, и обратите внимание: поскольку система координат на веб-странице перевернута, концептуально отрицательная скорость на самом деле положительна!   -  person Pointy    schedule 14.07.2013


Ответы (1)


Как уже предложил Пойнти, вы должны воздействовать на вектор скорости точек.

Гравитация — это сила, которая рассчитывается по формуле:

F_G = gamma * mass1 * mass2 / distance^2

Где gamma — гравитационная постоянная, а mass1 и mass2 — массы объектов. Вы получаете результирующее ускорение с:

F_G = a * mass1
a = F_G / mass1
  = gamma * mass2 / distance^2

И вы увидите, что ускорение не зависит от массы движущегося объекта. Остается gamma * mass2, которому вы можете присвоить произвольную константу. В зависимости от того, что лучше всего соответствует вашим потребностям.

Теперь у нас есть длина вектора ускорения. Направление конечно normalize(cursorPosition - pointPosition). Таким образом, общее ускорение равно:

d = cursorPosition - pointPosition
a = constant * d / length(d)^3

Зная это, вы можете обновлять скорость и скорость точки в каждом кадре:

velocity += a * dt
position += velocity * dt

где dt — продолжительность последнего кадра.

Вот ваш измененный пример кода. Линия if(distance < 6)... используется для ограничения ускорения (если точка проходит через центр тяжести, она бесконечно ускоряется).

person Nico Schertler    schedule 14.07.2013