Я пишу физический движок/симулятор, который включает в себя 3D космический полет, планетарную/звездную гравитацию, суворукость и релятивистские эффекты. Пока все идет хорошо, однако мне нужна помощь в математике алгоритма обнаружения столкновений.Обнаружение столкновений между ускоряющимися сферами
Итерационный моделирование движения, которое я использую в основном следующим образом:
(Примечание:. 3D Векторы ВСЕ CAPS)
For each obj
obj.ACC = Sum(all acceleration influences)
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2 (*EQ.2*)
obj.VEL = obj.VEL + (obj.ACC * dT)
Next
Где:
obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object
obj.Radius is the radius (scalar) of the object
dT is the time delta or increment
Я в основном необходимо найти эффективную формулу, полученную из (EQ.2) выше для двух объектов (obj1, obj2) и указать, если они когда-либо были сталкиваются, и если да, то в какое время. Мне нужно точное время и для того, чтобы я мог определить, будет ли он в это конкретное время увеличиваться (поскольку accelleratons будут отличаться при разных временных шагах), а также для того, чтобы я мог найти точное положение (которое я знаю, как это сделать, учитывая время)
для этого двигателя, я моделирование всех объектов как сферы, вся эта формула/algortithim нужно сделать, это выяснить, в каких точках:
(obj1.POS - obj2.POS).Distance = (obj1.Radius + obj2.Radius)
где .distance положительное скалярное значение. (Вы можете также сгруппировать обе стороны, если это проще, чтобы избежать функции квадратного корня, неявной в вычислении .Distance).
(да, я знаю много и много других проблем с обнаружением столкновений, однако их решения кажутся очень конкретными для их двигателя и предположений, и ни один из них не соответствует моим условиям: применяемые 3D, сферы и ускорение . в приращений имитационных Позвольте мне знать, если я ошибаюсь)
Некоторые Разъяснения:.
1) это не достаточно для меня, чтобы проверить * пересечения * из двух сфер до и после времени. Во многих случаях их скорости и изменения положения значительно превышают их радиусы.
2) RE: Эффективность, мне не нужна помощь (на данный момент так или иначе) в отношении определения вероятных кандидатов для столкновений, я думаю, что у меня это покрыто.
Еще одно уточнение, который, кажется, придумать много:
3) Мое уравнение (EQ.2) пошагового движения является квадратным уравнением, которое применяется как Velocity и ускорение:
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2
физике двигателей, которые я видел, (и, конечно, каждый игровой движок, что я когда-либо слышал) только линейный уравнения движения дополнительного, которые применяются только Скорость:
obj.POS = obj.POS + (obj.VEL * dT)
Вот почему я не могу использовать широко опубликованные решения для обнаружения столкновений, найденных на Stac kOverflow, в Википедии и по всему Интернету, например, найти пересечение/ближайший подход двух сегментов линии. Мое моделирование связано с переменными ускорениями, которые имеют фундаментальное значение для результатов, поэтому мне нужен пересечение/ближайший подход двух сегментов параболических.
спасибо tcovo, это хорошее начало именно в том, что мне нужно. Любая идея, как расширить решение кубического уравнения в Википедии до векторных коэффициентов? – RBarryYoung
Кубическое уравнение, которое я написал, имеет скалярные коэффициенты: точечное произведение двух векторов является скаляром, а квадрат величины также является скаляром. Я отредактировал свой ответ, чтобы подробно рассказать об этом. – tcovo
Ах, отлично! Спасибо ... – RBarryYoung