2013-03-01 4 views
4

Я искал в гугле много часов без ответа хорошо объяснил, я workign с освещением, и мне нужно нормали вершин, давайте предположим, что мы имеем этот буфер вершин (Это куб):Расчет нормалей вершин

static const GLfloat g_vertex_buffer_data[] = { 
-1.0f,-1.0f,-1.0f, 
-1.0f,-1.0f, 1.0f, 
-1.0f, 1.0f, 1.0f, 
1.0f, 1.0f,-1.0f, 
-1.0f,-1.0f,-1.0f, 
-1.0f, 1.0f,-1.0f, 
1.0f,-1.0f, 1.0f, 
-1.0f,-1.0f,-1.0f, 
1.0f,-1.0f,-1.0f, 
1.0f, 1.0f,-1.0f, 
1.0f,-1.0f,-1.0f, 
-1.0f,-1.0f,-1.0f, 
-1.0f,-1.0f,-1.0f, 
-1.0f, 1.0f, 1.0f, 
-1.0f, 1.0f,-1.0f, 
1.0f,-1.0f, 1.0f, 
-1.0f,-1.0f, 1.0f, 
-1.0f,-1.0f,-1.0f, 
-1.0f, 1.0f, 1.0f, 
-1.0f,-1.0f, 1.0f, 
1.0f,-1.0f, 1.0f, 
1.0f, 1.0f, 1.0f, 
1.0f,-1.0f,-1.0f, 
1.0f, 1.0f,-1.0f, 
1.0f,-1.0f,-1.0f, 
1.0f, 1.0f, 1.0f, 
1.0f,-1.0f, 1.0f, 
1.0f, 1.0f, 1.0f, 
1.0f, 1.0f,-1.0f, 
-1.0f, 1.0f,-1.0f, 
1.0f, 1.0f, 1.0f, 
-1.0f, 1.0f,-1.0f, 
-1.0f, 1.0f, 1.0f, 
1.0f, 1.0f, 1.0f, 
-1.0f, 1.0f, 1.0f, 
1.0f,-1.0f, 1.0f 
}; 

Итак, как я могу вычислить нормали вершин? Вот и все. Спасибо

ответ

7

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

Если у вас была более сложная (гладкая) поверхность со многими треугольниками, вы могли бы вычислять нормали, усредняя значения поперечных произведений сторон треугольников. Это дало бы самый плавный вид. В этом случае вы все еще принимаете художественное решение. На каждый объект нет ни одного ответа.

+0

Спасибо! Итак, если у меня есть плоский объект, мне не нужно нормализовать или использовать нормали вершин внутри освещения? Любой пример использования этих вершин для гладкого? – Spamdark

+3

@Spamdark: Вам все равно нужно * нормализовать * (убедитесь, что длина вектора равна * одному *) в вашем коде освещения для математики. Вам все еще нужна нормальная вершина. Попробуйте этот URL: http://www.lighthouse3d.com/opengl/terrain/index.php3?normals –

+0

Последний вопрос. 'усреднение значений поперечных произведений сторон треугольников . Чтобы получить крест из трех векторов сторон треугольника (v1, v2, v3), тогда' (cross1 + cross2 + cross3)/3 ' – Spamdark

3

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

This Lighthouse3D tutorial объясняет математику за вершинными нормалями, как и Slide 22 of this USC Lecture.