Физика для игрФорум

Collision Detection для геометрий, заданных SupportMapping'ом (комментарии) (6 стр)

Страницы: 13 4 5 6 7 8 Следующая »
#75
23:24, 5 дек 2012

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д функция будет одна и та же.

#76
23:37, 5 дек 2012

Спасибо за наводку, я сначала строил уравнение прямой через а иб потом проверял принадлежит ли она прямой и лежит ли в пределах отрезка. Так намного удобнее.
Хотя так красиво не получится - ява не умеет перегружать операторы

насколько я понимаю cross в 2д это вот это?

public double cross(AGVector2D v){
    return this ._x * v.getY() - this ._y * v.getX();
  }
#77
23:39, 5 дек 2012

На 3д меня пока не хватит, тут бы с 2д разобраться. да и нужно будет еще много чего делать кроме коллизий)

#78
23:43, 5 дек 2012

fysx
> Хотя так красиво не получится - ява не умеет перегружать операторы
это вовсе не обязательно. формулу

  return sqr((linePoint1 - linePoint0).cross(point - linePoint0)) < eps;

вполне можно заменить на

  return sqr(( linePoint1.sub(linePoint0) ).cross( point.sub(linePoint0) )) < eps;

это всё лучше, чем разбираться в каше безликих коэффициентов, количество которых до кучи меняется с размерностью пространства.

#79
23:45, 5 дек 2012

Ну да это я знаю, сделал. точки находятся, буду искать проблему в реакции на опору.

#80
23:45, 5 дек 2012

Спасибо за помощь!

#81
19:15, 14 дек 2012

Ссылка на  джава апплеты не работает(: Не могу понять про PD вектор. Как найти ближайшую вершину геометрии к началу координат (0,0) ясно. Только не пойму что значит, что вершина задана как разность двух исходных? И что за две исходные? Да и точка и вектор все же разные понятия. Наверно я сильно туплю)

#82
19:18, 14 дек 2012

разность минковского двух объектов - тоже объект. ближайшая точка к началу координат этого объекта - и есть pd вектор для двух исходных объектов. точка и вектор - одно и то же.

#83
19:33, 14 дек 2012

Оох. Допустим есть два бокса Безымянный | Collision Detection для геометрий, заданных SupportMapping'ом (комментарии)
Находим разность их позиций и получаем желтый вектор. Потом представляем вершины обеих боксов как вектора(для этого вычитаем из них позиции объектов) и находим вектор(вершину) направление которого больше совпадает с направлением нашего желтого вектора. Так?

#84
19:42, 14 дек 2012

WISHMASTER35
> Находим разность их позиций и получаем желтый вектор. Потом представляем
> вершины обеих боксов как вектора(для этого вычитаем из них позиции объектов) и
> находим вектор(вершину) направление которого больше совпадает с направлением
> нашего желтого вектора. Так?
нет. чтобы получить координаты точек разницы минковского, нужно из коодинат каждой точки одного тела в глобальной системе координат вычесть координаты каждой точки другого тела в глобальной системе координат. поточечно это делать очень долго и неэффективно, гораздо продуктивнее пользоваться знанием о том, как связаны support map'ы исходных геометрий и их разность.

#85
19:57, 14 дек 2012

Вот алгоритм определения пересечения 2х боксов.

+ Показать

Я так понимаю findCollisionPlane находит этот вектор. А находит она его выбирая вектор с минимальным depth.
А depth в свою очередь находится функцией intervalIntersect, в которой я уже ничего не пойму.
Но функция использует только направления(dirX, dirY) боксов, не очень похоже на твое описание support map'ов.

#86
20:17, 14 дек 2012

в том и разница, что я описал общий алгоритм, который работает для произвольных выпуклых геометрий - для боксов, для боксов с закруглёнными краями, для сфер, эллипсов и многоугольников в любых сочетаниях. с боксами всё гораздо проще и для них тот же самый pd вектор можно найти просто из аналитических соображений, используя теорему о разделяющих осях - достаточно перебрать все нормали обоих боксов и найти, на какую из этих осей пересечение проекций боксов минимально. в общем случае, если в столкновении участвуют не обязательно боксы, такую ось сразу указать нельзя, зато можно построить итеративную схему, сходящуюся к нужной оси, о чём я и попытался рассказать.

#87
3:35, 24 фев 2013

а когда точки совпадают то какую из них добовлять

#88
22:59, 15 апр 2013

Добрый вечер!
Опять разбираюсь в алгоритмах, появилось несколько вопросов. Работает очень некрасиво и медленно - уже руки опускаются.

1. Нужно ли округлять вектор pd о порядка angEps? без округления вносится погрешность и отскоко получается не совсем параллельным.
2. Почему то работает очень медленно уже на трех объектах. алгоритм зацикливатся, приходится ограничивать количество итераций.

+ Показать

3. Этоот вопрос относится уже больше к алгоритму sequental impulses - почему то при контакте параллельных боксов бокс с массой в люом случае начинает заворачиваться

+ Показать

4. Вопрос про контакты - при обнаружении точки контакта я создаю читыре контакт менифолда - правильно ли это - ведь при разрешении точки контакта расталкиваются оба тела.

Заранее спасибо за ответы, буду очень благодарен

#89
0:51, 16 апр 2013

fysx
> 1. Нужно ли округлять вектор pd о порядка angEps? без округления вносится
> погрешность и отскоко получается не совсем параллельным.
я pd нахожу обычно с точностью до 1e-2f. более точно смысла находить нет - это ж и так погрешность порядка одного градуса, ты не заметишь визуально разницы

> 2. Почему то работает очень медленно уже на трех объектах. алгоритм зацикливатся, приходится ограничивать количество итераций.
ищи ошибку. он в принципе не может зациклиться, так как стоит условие, что если больше нескольких итераций подряд(я беру четыре) не может улучшить результат, то он считается оптимумом. это условие необходимо, если считаются коллижны для многогранников.

Страницы: 13 4 5 6 7 8 Следующая »
Физика для игрФорум

Тема в архиве.