GJK Алгоритм испытаний треугольника граней - PullRequest
3 голосов
/ 13 июля 2011

Я перестраиваю свой алгоритм GJK, но у меня возникают проблемы с треугольными гранями для моего тетраэдра. Тем не менее, мои точечные и краевые тесты завершены.

Я хочу проверить, находится ли начало координат за пределами тетраэдра и ближе всего к определенной треугольной грани.

До сих пор мой метод состоял в том, чтобы вычислить нормали треугольной грани и выполнить серию тестов точечного произведения, чтобы определить, находится ли источник снаружи и ближе к этой грани. У моего метода есть одна главная проблема: я не могу гарантировать, что мои нормали обращены наружу. Посмотрите на этот рисунок, который я сделал для лучшего описания:

image

Как вы можете видеть один и тот же треугольник, в зависимости от упорядочения вершин требуется разное «упорядочение» перекрестных произведений для получения нормалей, обращенных наружу. Есть ли способ для меня, чтобы они смотрели наружу? Если нет, есть ли лучший метод для проверки этих лиц? Вот пример моего процесса:

if (dot(ABC, AO) > 0) {
        if (dot(ACD, AO) <= 0) {
            if (dot(ADB, AO) <= 0) {
                if (dot(DCB, DO) <= 0) {
                    // closest to face of ABC

                }
            }
        }
    }
}

Ссылка:

ABC, ACD, ADB, DCB = нормали треугольной грани (как вы можете видеть, я предполагаю, что на рисунке изображен «левый» треугольник)

AO = вектор от A до источника

DO = вектор из А в начало

1 Ответ

3 голосов
/ 13 июля 2011

Давайте работать с лицом ABC. Форма нормальная, используя N = cross(B-A, C-A). Если dot(N, D-A) > 0, то N указывает внутрь и нуждается в обратном направлении. Наконец, нормализуйте N, чтобы получить единицу, нормальную при необходимости.

...