2016-11-06 7 views
4

Для выпуклого многогранника с определенными вершинами (x, y, z), определяющими грани многогранника.Вычисление нормалей и обмотки граней

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

Мне нужна нормальная поверхность, чтобы вычислить нормальную вершину для выполнения Gouraud shading. Единственный ключ, который я мог бы найти о том, как это сделать, - метод Ньюэлла, но как я могу убедиться, что нормали являются внешними нормалями, а не внутренними? Спасибо за любую помощь.

ответ

4

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 }.

Используя эту информацию, вы можете легко ориентировать свои треугольники: проверить каждый треугольник, используя матрицу предикатов. Если тест не удался, просто замените порядок любых двух последовательных элементов вершин и решить проблему.

+0

Спасибо за ответ. –

+0

Еще одно предложение: для каждого многогранника установите «x3» в центр многогранника (это особенно удобно в пространстве модели, где начало координат является центром), поэтому всякий раз, когда вы получаете отрицательную матрицу, вы знаете, что 'x3' находится на отрицательной стороне, что означает, что внешнее направление будет положительной стороной. – plasmacel

+0

Это отличное предложение. Благодаря! –

1

Простой подход состоит в том, чтобы сначала вычислить (bary) центр C многогранника путем усреднения всех вершин. Так как многогранник выпуклый, он будет находиться внутри него. Затем для каждого лица вычисляют нормаль через поперечное произведение любых двух ребер грани, а затем определяют направление нормали путем вычисления точечного произведения нормали с V-C, где V - одна из вершин на грани; если этот точечный продукт отрицательный, нормаль внутренне настолько отрицательна (каждый компонент) нормали, чтобы получить внешнюю нормаль.

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

  • Нет связанных вопросов^_^