2010-09-16 3 views
4

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

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

+0

Не могли бы вы кратко объяснить эффект рендеринга, который вы пытаетесь достичь? – tibur

+0

Любые треугольники на одной плоскости будут отображаться как одна плоская заливка, поэтому я буду вычислять, какие треугольники могут объединиться в многоугольники (один раз), а затем сделать их рисованием одной формы (для каждого рендера). –

ответ

3

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

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

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

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

+0

Это будет очень чувствительно ко всем возможным округлениям ошибки. –

+2

@Jenko «Пришлите мне кодз», потому что вы не математик-эксперт? Честно говоря, если вы пишете 3D-движок, вы должны знать немного о математике, используемой для создания двигателя. В противном случае вы просто копируете и вставляете другие решения, не зная, действительно ли они обращаются к тем, что вы пытаетесь выполнить. –

+2

Если вы испугались слова * vector * или * matrix *, вы должны, по крайней мере, прочитать некоторые трехмерные математические учебные пособия, например, следующие, или вы никогда не успеете написать свой 3D-движок. http://chortle.ccsu.edu/VectorLessons/vectorIndex.html – tibur

2

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

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

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

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

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

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

+0

Это примерно эквивалентно анализу основных компонентов? – tibur

+0

@tibur: это * - * анализ основных компонентов –

Смежные вопросы