У меня есть следующий цилиндр, я рисую червя в opengl, и я хочу рассчитать нормали вершин.Как рассчитать вершинные нормали цилиндра?
ответ
Вычислить нормалей для каждой грани (треугольник) и сохранить его где-нибудь. Теперь для каждой вершины у вас есть несколько лиц, которые разделяют вершину (типично 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
всех нормалей и некоторую логику, говорящую, какие нормали имеют значение для какой вершины.
Для каждой точки на цилиндр кольце, vertexNormal = normalize(vertexPosition - ringCenter);
Или вы могли бы вычислить их, как правило, где нормальным нормируются сумма все лицо нормалей для каждой грани, содержащей эту вершину.
Создайте один нормальный для каждой вершины одновременно с созданием вершины, используя приведенную выше формулу. Это будет работать для цилиндра, как описано. –
должно ли это работать? для моего теста он, похоже, не работает ... это то, что я сделал: 'normal.x = (V1.x + V2.x + V3.x)/3.0f' (для треугольника), а затем i нормализован в конце , что я сделал не так? – Rookie
@Rookie Это не формула для вычисления нормали треугольника из его вершин. Для этого вам нужно [перекрестный продукт] (http://en.wikipedia.org/wiki/Cross_product). Мой ответ заключается в том, чтобы сделать в среднем несколько нормальных векторов. – Fiktik
Извините, я вас неправильно понял, так как я понял, что ОП спрашивает, как рассчитать нормали, а не как рассчитать гладкие нормали ... – Rookie