fysx
тебе самому-то удобно в этих кучах x и y разбираться? перегрузи нормально все операторы, тогда формулы внезапно станут контактными и из мешанины символов приобретут смысл. например, твоя функция принадлежности точки отрезку могла выглядеть так(предполагается, что точка лежит на прямой, содержащей отрезок):
public boolean checkPointInSegment(AGVector2D a, AGVector2D b, AGVector2D x) { return ( x - a).dot( x - b) < 0; }
если нужно проверить, принадлежит ли точка x прямой, содержащей отрезок, то будет как-то так(перейду на c++)
template<typename Space> bool checkPointOnLine(typename Space::Vector linePoint0, typename Space::linePoint1, typename Vector point) { return sqr( ( linePoint1 - linePoint0).cross( point - linePoint0)) < eps; }
обрати внимание, что в таком виде для 2д и 3д функция будет одна и та же.
Спасибо за наводку, я сначала строил уравнение прямой через а иб потом проверял принадлежит ли она прямой и лежит ли в пределах отрезка. Так намного удобнее.
Хотя так красиво не получится - ява не умеет перегружать операторы
насколько я понимаю cross в 2д это вот это?
public double cross(AGVector2D v){ return this ._x * v.getY( ) - this ._y * v.getX( ); }
На 3д меня пока не хватит, тут бы с 2д разобраться. да и нужно будет еще много чего делать кроме коллизий)
fysx
> Хотя так красиво не получится - ява не умеет перегружать операторы
это вовсе не обязательно. формулу
return sqr(( linePoint1 - linePoint0).cross( point - linePoint0)) < eps;
вполне можно заменить на
return sqr(( linePoint1.sub( linePoint0) ).cross( point.sub( linePoint0) )) < eps;
это всё лучше, чем разбираться в каше безликих коэффициентов, количество которых до кучи меняется с размерностью пространства.
Ну да это я знаю, сделал. точки находятся, буду искать проблему в реакции на опору.
Спасибо за помощь!
Ссылка на джава апплеты не работает(: Не могу понять про PD вектор. Как найти ближайшую вершину геометрии к началу координат (0,0) ясно. Только не пойму что значит, что вершина задана как разность двух исходных? И что за две исходные? Да и точка и вектор все же разные понятия. Наверно я сильно туплю)
разность минковского двух объектов - тоже объект. ближайшая точка к началу координат этого объекта - и есть pd вектор для двух исходных объектов. точка и вектор - одно и то же.
Оох. Допустим есть два бокса
Находим разность их позиций и получаем желтый вектор. Потом представляем вершины обеих боксов как вектора(для этого вычитаем из них позиции объектов) и находим вектор(вершину) направление которого больше совпадает с направлением нашего желтого вектора. Так?
WISHMASTER35
> Находим разность их позиций и получаем желтый вектор. Потом представляем
> вершины обеих боксов как вектора(для этого вычитаем из них позиции объектов) и
> находим вектор(вершину) направление которого больше совпадает с направлением
> нашего желтого вектора. Так?
нет. чтобы получить координаты точек разницы минковского, нужно из коодинат каждой точки одного тела в глобальной системе координат вычесть координаты каждой точки другого тела в глобальной системе координат. поточечно это делать очень долго и неэффективно, гораздо продуктивнее пользоваться знанием о том, как связаны support map'ы исходных геометрий и их разность.
Вот алгоритм определения пересечения 2х боксов.
Я так понимаю findCollisionPlane находит этот вектор. А находит она его выбирая вектор с минимальным depth.
А depth в свою очередь находится функцией intervalIntersect, в которой я уже ничего не пойму.
Но функция использует только направления(dirX, dirY) боксов, не очень похоже на твое описание support map'ов.
в том и разница, что я описал общий алгоритм, который работает для произвольных выпуклых геометрий - для боксов, для боксов с закруглёнными краями, для сфер, эллипсов и многоугольников в любых сочетаниях. с боксами всё гораздо проще и для них тот же самый pd вектор можно найти просто из аналитических соображений, используя теорему о разделяющих осях - достаточно перебрать все нормали обоих боксов и найти, на какую из этих осей пересечение проекций боксов минимально. в общем случае, если в столкновении участвуют не обязательно боксы, такую ось сразу указать нельзя, зато можно построить итеративную схему, сходящуюся к нужной оси, о чём я и попытался рассказать.
а когда точки совпадают то какую из них добовлять
Добрый вечер!
Опять разбираюсь в алгоритмах, появилось несколько вопросов. Работает очень некрасиво и медленно - уже руки опускаются.
1. Нужно ли округлять вектор pd о порядка angEps? без округления вносится погрешность и отскоко получается не совсем параллельным.
2. Почему то работает очень медленно уже на трех объектах. алгоритм зацикливатся, приходится ограничивать количество итераций.
3. Этоот вопрос относится уже больше к алгоритму sequental impulses - почему то при контакте параллельных боксов бокс с массой в люом случае начинает заворачиваться
4. Вопрос про контакты - при обнаружении точки контакта я создаю читыре контакт менифолда - правильно ли это - ведь при разрешении точки контакта расталкиваются оба тела.
Заранее спасибо за ответы, буду очень благодарен
fysx
> 1. Нужно ли округлять вектор pd о порядка angEps? без округления вносится
> погрешность и отскоко получается не совсем параллельным.
я pd нахожу обычно с точностью до 1e-2f. более точно смысла находить нет - это ж и так погрешность порядка одного градуса, ты не заметишь визуально разницы
> 2. Почему то работает очень медленно уже на трех объектах. алгоритм зацикливатся, приходится ограничивать количество итераций.
ищи ошибку. он в принципе не может зациклиться, так как стоит условие, что если больше нескольких итераций подряд(я беру четыре) не может улучшить результат, то он считается оптимумом. это условие необходимо, если считаются коллижны для многогранников.
Тема в архиве.
Слотокинг - лучшие игровые автоматы Слотокинг - лучшие игровые автоматы obzor365.com |