Я работаю с API-интерфейсом для лица Kinect, он предоставляет массив вершин и индексов для треугольников, которые должны быть визуализированы для создания изображения лица.
Нет вершин и их порядок в массиве, а также индексы, заданные kinect, всегда постоянны.
Однако API не дает информации о данных УФ и нормалях вершин.
Приложение требует, чтобы я сохранял порядок вершин, заданный kinect, так как их положения в трехмерном пространстве изменяются в соответствии с движением лица, так что генерация ультрафиолета и нормалей в программном обеспечении для трехмерного редактирования не подлежит сомнению.
Мне удалось сгенерировать UV, спроецировав положения вершин на 2D-плоскость, поскольку в одной плоскости было очень мало вершин.
Тем не менее, я не знаю, как генерировать нормали вершин для сетки, без нормали вершин сетка граней отрисовывается без глубины своих элементов от предполагаемой, хотя силуэт виден, поскольку положения вершин верны.
Я понимаю, что из-за отсутствия нормалей вершин освещение не будет работать правильно на нем, и, следовательно, бледная безликая сетка, которую он смотрит прямо сейчас.
Итак, как я могу генерировать нормали вершин, когда все, что у меня есть, это просто положение вершины и индекс вершин, чтобы сделать из нее треугольники?
источник
x
является кросс-продуктом)Ответы:
Вычислить нормаль из позиций вершин довольно просто, используя векторное произведение.
Если вы не знакомы с кросс-продуктом, я предлагаю вам прочитать об этом и освоиться с ним. Нормалы тогда будут казаться простыми.
Плоские штриховые нормали
В коде это будет выглядеть,
n = normalize(cross(b-a, c-a))
например. Просто примените это на все ваши лица, и вы будете иметь свои нормали на лицо.Обратите внимание, что это предполагает, что вершины не являются общими для треугольников. Я не знаком с API Kinect; вполне возможно, что они являются общими, и в этом случае вам придется дублировать их или перейти к следующему решению:
Плавное затенение нормалей
После освещения с помощью нормалей, рассчитанных, как указано выше, вы заметите, что края треугольника очевидны. Если это нежелательно, вы можете вместо этого вычислять гладкие нормали, принимая во внимание все грани, которые имеют одну и ту же вершину.
Помните, как поперечное произведение пропорционально площади? Если вы сложите перекрестные продукты, а затем нормализует сумму, она получит именно ту весовую сумму, которую мы хотим. Таким образом, алгоритм становится:
Этот метод более подробно объясняется в статье Иньиго Квилеса: умная нормализация сетки .
Подробнее о нормалях смотрите также:
источник