Вычислить, если два 3D-треугольника находятся на одной плоскости - PullRequest
4 голосов
/ 16 сентября 2010

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

Будет ли вычисление нормальной поверхности и сравнение тех, кто когда-либо получал 2 эквивалентных нормали?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

Почему вы хотите это сделать?Какое количество треугольников вы ожидаете проверить?Это кажется немного сложным для алгоритма рендеринга в реальном времени!

В любом случае:

Вычислить нормальное n треугольника.Затем вычислите уравнение плоскости: a.x + b.y + c.z + d = 0, где (a,b,c) - норма вашего треугольника, а d = - dot(n,P) (P - одна из ваших вершин треугольника).Сделайте то же самое для второго треугольника.

Две плоскости одинаковы, если четыре значения abcd равны или противоположны (все вместе).

2 голосов
/ 16 сентября 2010

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

Однако вы можете проверить, "находятся ли два треугольника в одной плоскости в пределах некоторого допуска". Это очень трудно сделать, и здесь ошибки округления, вероятно, испортят любой возможный метод. В самом деле, всякий раз, когда треугольники тонкие, существует большая неопределенность относительно плоскости, на которой они живут.

Я мог бы указать вам немного литературы, если вы действительно хотите (лучше всего было бы взглянуть на библиотеку CGAL и посмотреть, реализовали ли они что-то, имеющее отношение к вашей проблеме). Все, что, вероятно, будет включать в себя числа с плавающей запятой произвольной точности, разумное переупорядочение операций и в любом случае приведет к неточным результатам.

Поэтому я настоятельно рекомендую вам найти другой подход к вашей актуальной проблеме.

Ошибки округления являются (огромной) проблемой, если вы пытаетесь вычислить уравнение плоскости, проходящей через три точки, а затем проверить три другие. Есть другое решение.

Возможно, вы захотите вычислить матрицу инерции из ваших шести точек, диагонализировать ее и посмотреть, находится ли ее наименьшее собственное значение в некотором крошечном значении двух других. Это будет означать, что ваши шесть точек на самом деле лежат в одной плоскости, в пределах допуска.

...