Compute лицо нормального
Вы должны вычислить векторное произведение двух векторов, охватывающее плоскость, которая содержит данное лицо. Он дает вам (не единичный) нормальный вектор этого лица. Вы должны его нормализовать, и все готово.
Если x0
, x1
, x2
являются вершинами треугольной грани, то нормальный может быть вычислена как
vector3 get_normal(vector3 x0, vector3 x1, vector3 x2)
{
vector3 v0 = x0 - x2;
vector3 v1 = x1 - x2;
vector3 n = cross(v0, v1);
return normalize(n);
}
Обратите внимание, что перекрестное произведение следует за right-hand rule:
Пра- что ориентация вектора перекрестного определяется путем размещения u и v хвост к хвосту, уплощения правой руки, расширяя его в направлении у, а затем свернуться пальцами в направлении, что угол v делает с ¯u. Затем большой палец указывает в направлении крест (u, v).
Orient ваши треугольники
Чтобы убедиться, что все ваши нормалей указывая внутри/вне многогранника, треугольники должны быть равномерно ориентированным, что означает, что все вершины должны следовать против часовой стрелки (CCW) или по часовой стрелке (CW). Это также называется обмоткой в компьютерной графике.
Вы можете проверить ориентацию ваших треугольников, вычислив определитель матрицы ниже, где - это четвертая точка, точка вашего просмотра во время теста.
| x0.x x0.y x0.z 1 |
| x1.x x1.y x1.z 1 |
| x2.x x2.y x2.z 1 |
| x3.x x3.y x3.z 1 |
- определитель> 0: находится на
+
стороне плоскости, определяемой точками ЕГО { x0, x1, x2 }
- детерминанта < 0: находится на
-
стороне плоскости, определяемой CCW пункты { x0, x1, x2 }
- детерминант = 0:
x3
компланарен с { x0, x1, x2 }
Поворота порядка вершин (сдвигая все из них левых или правых) не меняет ориентацию. Таким образом, { x0, x1, x2 }
имеет ту же ориентацию, что и { x2, x0, x1 }
и { x1, x2, x0 }
.
Однако, если вы поменяете порядок двух последовательных элементов, вы также поменяетесь на противоположную ориентацию. Это означает, что { x0, x1, x2 }
имеет противоположную ориентацию, как { x1, x0, x2 }
.
Используя эту информацию, вы можете легко ориентировать свои треугольники: проверить каждый треугольник, используя матрицу предикатов. Если тест не удался, просто замените порядок любых двух последовательных элементов вершин и решить проблему.
Спасибо за ответ. –
Еще одно предложение: для каждого многогранника установите «x3» в центр многогранника (это особенно удобно в пространстве модели, где начало координат является центром), поэтому всякий раз, когда вы получаете отрицательную матрицу, вы знаете, что 'x3' находится на отрицательной стороне, что означает, что внешнее направление будет положительной стороной. – plasmacel
Это отличное предложение. Благодаря! –