}0RIC)-(, симулятор резинового шарика работает отлично P.S. у меня так и не получилось загнать один в другой. Но выглядит всё боеспособно, так что продолжай
Ну дак яж это учёл)) Продолжаю работать над твердыми телами. Но прежде чем заняться их физикой, нужно придумать штуку, срабатывающую при перекрытии тел. В книге Д.Конгера описан метод, как по мне дак не очень быстродейственный, объясню суть.
есть 2 каких-то объекта, движущихся друг к другу:
и за 1 кадр анимации так получилось что они перекрылись:
По методу описанному в книге делим время потраченное на этот кадр на 2, и пересчитываем новое положение шарика. (подобно откату во времени)
Если они теперь не касаются, то двигаем их на половину-половины времени вперед а если все еще пересекаются - назад:
если они еще не касаются, повторяем:
естественно повторяем не до бесконечности, а до определенной точности, после такого отката просчитывается физика столкновений, а оставшееся время кадра (мы же откат делали) объект просто свободно двигается.
Метод, действительно рабочий и поможет избежать кучи артефактов, но он не очень быстродейственный. я же сейчас буду искать каким образом сразу найти промежуток времени до столкновения:
буду работать.
Сообщение отредактировал }0RIC)-( - Среда, 15.08.2012, 19:31
Вообще это не метод обнаружения коллизии, это крайние меры чтобы не допустить впечатывание на большой скорости одного объекта в другой. Я тут поразмышлял, и понял что не взял в расчет скорость вращения объектов, ведь они могут быть и не в форме шариков:
Походу придется пользоваться методом описанным в книге... Либо... только что нашел словосочетание "НЕПРЕРЫВНОЕ ОТСЛЕЖИВАНИЕ СТОЛКНОВЕНИЙ" в описании физ. движка PhysX. Разберемся что это. В общем это вытягивание объема от старого положения объекта до нового:
За эти промежутки времени программа не обнаружит столкновение, а если вытянуть объем и проверить пересечение с ним:
все прекрасно обнаруживается, но опять же, это для не вращающихся объектов, ведь может произойти и такая ситуация:
в итоге в нужном месте объема вообще не будет, столкновения тем более. Буду думать.
Сообщение отредактировал }0RIC)-( - Четверг, 16.08.2012, 10:50
В общем подумав, понял что это вообще немного разное) Метод в книге - борьба с врезанием одного объекта в другой. Метод из PhysX - борьба с пролетом одного объекта через другой. Появилась идея их комбинировать. Суть идеи: Для каждого объекта помимо коллизии будет своя ограничивающая сфера (не участвующая в столкновениях) В каждом кадре вытягиваем цилиндр (радиус которого равен радиусу сферы) из старого положения в новое:
При таком раскладе без разницы как повернуты объекты, сфера останется сферой. Если обнаружено столкновение между такими объемами, выполняем откат объекта в эту точку, а дальше методом из книги проверяем на перекрытие, делим время на 2 и.т.д...
Ну вот, вывел формулу. Формула по заданным векторам скоростей, заданным положениям объектов, находит промежуток времени, когда объекты двигаясь будут находиться на расстоянии суммы радиусов их ограничивающих сфер. Может я сморозил и ахинею, простым языком: есть 2 прямые, я нахожу точки на этих прямых, находящиеся на определенном расстоянии друг от друга. Ехе-шник прикрепил. Пока отключил физику и оставил только создание объектов, ну и тестовый код, который и находит координаты сфер. замечу только что сферы находятся на одинаковом расстоянии друг от друга. Попробую прикрутить эту формулу для материальных точек. а пока смотрим ехе:
Немного о формуле, может кому пригодится: есть 2 параметрических луча, с параметром t (время)
A = a*t+P1 // a - вектор, направление луча. P1- координаты начальной точки луча. B = b*t+P2 // b - вектор, направление луча. P2- координаты начальной точки луча.
И есть радиусы сфер R1 и R2.
Нам нужно найти параметр t, где координаты этих лучей находятся на расстоянии (R1 + R2):
Вот формулы: 1)Находим вектор F = a - b (векторы a и b задают направление, поэтому отложены от начала координат) 2)Находим вектор Q = P2 - P1
3)Считаем коэффициенты a, b, c, для решения квадратного уравнения: a = F.x*F.x + F.y*F.y + F.z*F.z // Квадрат длинны вектора F b = F.x*Q.x + F.y*Q.y + F.z*Q.z // Проекция вектора F на Q c = Q.x*Q.x + Q.y*Q.y + Q.z*Q.z - (R1+R2)*(R1+R2) // Квадрат длинны вектора Q минус квадрат суммы радиусов
А дальше находим 2 параметра: t1 = (-b + sqrt(b*b - a*c))/a t2 = (-b - sqrt(b*b - a*c))/a
Меньший параметр - то что нам нужно. Чтобы найти координаты сфер, нужно подставить меньший t в параметрические уравнения лучей.