Ориентация тетраэдра для треугольных сеток
У меня есть 2 треугольника и вершины p0, p1, p2, p3. Эти два треугольника имеют общее ребро. Из этих двух треугольников я хочу сделать тетраэдр, заданный 4 вершинами. Библиотека, с которой я работаю, требует, чтобы" 4 вершины были заданы таким образом, чтобы четыре вершины-тройки, определяющие грани тетраэдра на чертеже, появлялись в порядке против часовой стрелки при взгляде снаружи " . Предполагая, что один из двух треугольников равен p0, p1, p2, я вычисляю Нормаль как (p1-p0) (крест) (Р2-Р0). Может ли кто-нибудь, пожалуйста, сказать мне, как обеспечить выполнение этого условия ?
1 ответ:
Краткий ответ:
Условие состоит в том, что
Таким образом, после вычисления нормали для этой плоскости вам нужно определить, указывает ли вектор от (скажем)p3
должно находиться на правильной стороне плоскости, определяемой(p0, p1, p2)
.p0
доp3
в том же направлении нормали или в противоположном направлении, взяв точечное произведениеdot(normal, p3-p0)
.
Говоря более математически:
Вам нужно найти определитель матрицы 4x4, образованной однородными координатами из четырех пунктов. Знак детерминанта определяет, выполняется ли условие; соответствующий знак зависит от используемых точных условностей, но в идеале он должен быть положительным:
require: 0 < det(p0, p1, p2, p3) == det [ p0.x p0.y p0.z 1 ] [ p1.x p1.y p1.z 1 ] [ p2.x p2.y p2.z 1 ] [ p3.x p3.y p3.z 1 ]
Если определенный упорядоченный набор точек имеет отрицательный детерминант, его можно исправить, поменяв местами любые две точки (что приведет к отрицанию детерминанта):
e.g., swapping p0 and p2: det(p0, p1, p2, p3) = - det(p2, p1, p0, p3) ^ ^ ^ ^
Или, в более общем смысле, переключение между четными и нечетными перестановками четырех вершин.
Если определитель равен ноль, четыре точки являются сопланарными и не могут быть зафиксированы подобным образом.
Наконец, код:
Относительно простой способ вычисления этого определителя с помощью трехмерной векторной математики:
Конечный детерминант также известен как" тройное произведение " v1, v2 и v3. Обратите внимание, что я колебался, пытаясь расшифровать точную условность знака (то есть, нужно ли вам, чтобы определитель был положительным или отрицательным) из вашего вопроса: формулировка и диаграмма, которую вы предоставляете, являются более чем немного сбивает с толку. Однако, поскольку у вас есть оригинальная библиотека и ее документация, вы находитесь в лучшем положении, чтобы ответить на этот вопрос. В крайнем случае, вы можете попробовать эмпирический метод: попробуйте оба знака и выберите тот, который не взрывается...let: v1 = p1 - p0 v2 = p2 - p0 v3 = p3 - p0 norm12 = cross(v1, v2) -> determinant = dot(norm12, v3)