2012-03-02 5 views

ответ

2

Вычислить нормалей для каждой грани (треугольник) и сохранить его где-нибудь. Теперь для каждой вершины у вас есть несколько лиц, которые разделяют вершину (типично 6 на вашем снимке). Ваша конечная нормальная вершина - среднее значение нормалей граней. Для 6 граней, вы вычисляете:

int faceCount = 6; 
float sum = 0.0f; 
for(int face = 0; face < faceCount; ++face) 
    sum += faceNormals[face].x; 
normal.x = sum/faceCount; 
// and so on for y and z 

Не забудьте нормализовать результирующий вектор, так что его длина равна 1.

ПРИМЕЧАНИЕ: Не ставить faceNormals в массиве, как это. В реальном коде вы, вероятно, захотите иметь один контейнер размером vector всех нормалей и некоторую логику, говорящую, какие нормали имеют значение для какой вершины.

+0

должно ли это работать? для моего теста он, похоже, не работает ... это то, что я сделал: 'normal.x = (V1.x + V2.x + V3.x)/3.0f' (для треугольника), а затем i нормализован в конце , что я сделал не так? – Rookie

+0

@Rookie Это не формула для вычисления нормали треугольника из его вершин. Для этого вам нужно [перекрестный продукт] (http://en.wikipedia.org/wiki/Cross_product). Мой ответ заключается в том, чтобы сделать в среднем несколько нормальных векторов. – Fiktik

+0

Извините, я вас неправильно понял, так как я понял, что ОП спрашивает, как рассчитать нормали, а не как рассчитать гладкие нормали ... – Rookie

3

Для каждой точки на цилиндр кольце, vertexNormal = normalize(vertexPosition - ringCenter);

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

+1

Создайте один нормальный для каждой вершины одновременно с созданием вершины, используя приведенную выше формулу. Это будет работать для цилиндра, как описано. –