Обнаружение столкновений с использованием алгоритма GJK работает неправильно.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обнаружение столкновений с использованием алгоритма GJK работает неправильно.

Сообщение Anonymous »

Я реализовал систему обнаружения столкновений с использованием алгоритма GJK на C++ и GLM. Однако алгоритм ошибочно обнаруживает столкновения, когда объекты на самом деле не пересекаются. Я ищу способы повысить точность моей реализации.
Успешное обнаружение.
введите здесь описание изображения
Неправильное обнаружение столкновений
введите здесь описание изображения
Я ссылался на следующий веб-сайт.
https://winter.dev/articles/gjk-algorithm
Я не смог найти подобных случаев сбоя на других веб-сайтах.
Однако ни один из операторов if в моей программе никогда не выполняется. Возможно, в этом проблема. Эта часть практически является копией кода с сайта выше.

Код: Выделить всё

bool Colider::Tetrahedron(Simplex& simplex, glm::vec3 dir)
{
glm::vec3 a = simplex[0];
glm::vec3 b = simplex[1];
glm::vec3 c = simplex[2];
glm::vec3 d = simplex[3];

glm::vec3 ab = b - a;
glm::vec3 ac = c - a;
glm::vec3 ad = d - a;
glm::vec3 point = -a;

glm::vec3 abc = glm::cross(ab, ac);
glm::vec3 acd = glm::cross(ac, ad);
glm::vec3 adb = glm::cross(ad, ab);

if (sameDirection(abc, point))
{
simplex = { a,b,c };
return Triangle(simplex, dir);
}

if (sameDirection(acd, point))
{
simplex = { a,c,d };
return Triangle(simplex, dir);
}

if (sameDirection(adb, point))
{
simplex = { a,d,b };
return Triangle(simplex, dir);
}

return true;
}
Прилагаем репозиторий GitHub для этого проекта. Конкретную функцию, о которой вы спрашивали, можно найти в заголовочном файле Collider.h и файле реализации Collider.cpp.
PS.
При построении треугольного симплекса я обнаружил, что первая (последняя добавленная) и вторая вершины одного треугольника имели одинаковые координаты. Это привело к включению нулевого вектора при проверке начала координат внутри симплекса и при анализе тетраэдров. Возможно, это привело к уменьшению размеров симплекса (от треугольного симплекса к отрезку прямой или от тетраэдрического симплекса к треугольнику).

Подробнее здесь: https://stackoverflow.com/questions/790 ... g-properly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»