Как я могу найти нормали для каждой вершины объекта, чтобы я мог применить плавное затенение с OpenGL? - PullRequest
4 голосов
/ 30 ноября 2010

Я загружаю объект из .off файла .Этот формат файла не определяет нормали для граней или вершин объекта.Я нашел нормали лица, используя векторный продукт.Но я не знаю, как найти нормали для каждой вершины, есть идеи?

Ответы [ 4 ]

4 голосов
/ 30 ноября 2010

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

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

2 голосов
/ 30 ноября 2010

Некоторые файлы .obj вообще не имеют нормалей.Сначала вы должны вычислить нормали для каждого лица:

Учитывая грань, состоящую из 3 вершин v1, v2, v3, вы можете вычислить нормаль: нормаль - это нормализованное перекрестное произведение между v1 - v2 и v1 - v3

N = Normalize( (v1 - v2) x (v1 - v3) ) 

Normalize(V) = V / length(V)

length(V) = SQRT (V.x * V.x + V.y * V.y + V.z * V.z)

Перекрестное произведение:

v × u = (v.y * u.z − v.z * u.y, v.z * u.x − v.x * u.z, v.x * u.y − v.y * u.x).

После этого вы можете вычислить "гладкие" нормали путем усреднения всех нормалей смежных граней.

1 голос
/ 30 ноября 2010

См. Пример "Вычисление нормалей для достижения плоского и плавного затенения" (метод ComputeVerticeNormal ):

// Average all adjacent faces normals to get the vertex normal
GLpoint pn;
pn.x = pn.y = pn.z = 0;
for (int jx = 0; jx < nbAdjFaces; jx++) 
{ 
   int ixFace= m_pStorage[jx];
   pn.x += m_pFaceNormals[ixFace].x;
   pn.y += m_pFaceNormals[ixFace].y;
   pn.z += m_pFaceNormals[ixFace].z;
} 
pn.x /= nbAdjFaces;
pn.y /= nbAdjFaces; 
pn.z /= nbAdjFaces; 

// Normalize the vertex normal 
VectorNormalize(&pn, &m_pVertNormals[ixVertice]);
0 голосов
/ 27 сентября 2013

"verage нормали для всех граней, которые разделяют вершину.

То есть просто добавьте все нормали к смежным граням и нормализуйте результат. "

Я пробовал это, и иногда вы получаете странные результаты, когда, по крайней мере, две нормали имеют угол 180.

Мне кажется, лучше использовать биссектрисы:

У вас есть 3 нормальных вектора: найдите биссектрису для вектора 2 и 3, а затем найдите биссектрису для вектора 1 и другой биссектрисы. ТО нормализуем результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...