Програмно-породжуючі вершинні нормали


11

Я працюю з api обличчям Kinect, він надає масив вершин і індексів для трикутників, який повинен бути наданий для створення зображення обличчя.

Ні вершин, а їх порядок у масиві, а також індекси, задані kinect, завжди постійні.

Однак api не дає інформації про УФ-дані та вершинні норми.

Додаток вимагає від мене дотримуватися вершинного порядку, який видає kinect, оскільки їх положення в 3d-просторі змінюються відповідно до руху обличчя, тому генеруючи uv і нормали в програмному забезпеченні для редагування 3d не виникає сумніву.

Мені вдалося генерувати УФ, проектуючи положення вершин на 2D площину, оскільки на одній площині було дуже мало вершин.

Однак я не знаю, як генерувати вершинні норми для сітки, без нормальної вершини сітка обличчя малює без глибини її особливостей з перспективної, хоча силует видно як вершинні положення вершин.

Я розумію, що через відсутність вершинних норм освітлення на ньому не працює правильно, а отже, бліда безхарактерна сітка зараз виглядає.

тож як я генерую нормальні вершини, коли все, що я маю, - це лише положення вершин і індекс вершин, щоб зробити з нього трикутники?


n = (v1 - v0) x (v2 - v0), де v0, v1 і v2 - вершини відповідної (трикутникової) грані. Замовлення є важливим. Нормалізуйте це, якщо вам справді потрібно. (і xє перехресним продуктом)
3Dave

Відповіді:


14

Обчислити норму з вершинних позицій досить просто, використовуючи векторний поперечний добуток.

Векторний добуток двох векторівu і v (відмічено у×vабо іноді уv) - вектор, перпендикулярний до у і v, довжини ||у×v||=||у||||v||сiн(θ), с θ кут між у і v. Напрямок вектора буде залежати від порядку множення:у×v є протилежністю v×у (два напрямки, перпендикулярні площині).

Якщо ви не знайомі з крос-продуктом, я пропоную вам ознайомитись з ним та отримати задоволення від нього. Звичайні норми будуть здаватися простими.

Норма плоских відтінків

Якщо у вас є трикутник АБС, АБ×АС- вектор, перпендикулярний трикутнику і довжиною, пропорційною його площі. Оскільки нормальним є одиничний вектор, перпендикулярний площині трикутника, норма можна отримати за допомогою:

N=АБ×АС||АБ×АС||

У коді це виглядатиме, n = normalize(cross(b-a, c-a))наприклад. Просто нанесіть це на всі обличчя, і ви матимете свої норми на обличчя.

For each triangle ABC
    n := normalize(cross(B-A, C-A))
    A.n := n
    B.n := n
    C.n := n

Зауважте, що це передбачає, що вершини не поділяються між трикутниками. Я не знайомий з API Kinect; цілком можливо, що вони є спільними, і в цьому випадку вам доведеться їх дублювати або перейти до наступного рішення:

Норма гладкого затінення

Після освітлення нормалями, обчисленими вище, ви помітите, що краї трикутника є видимими. Якщо це не бажано, ви можете замість цього обчислити гладкі норми, враховуючи всі грані, які мають однакову вершину.

Ідея полягає в тому, що якщо однакова вершина ділиться на три трикутники Т1, Т2 і Т3 наприклад, нормальний N буде середнім N1, N2 і N3. Причому, якщоТ1 - великий трикутник і Т2 це крихітний, напевно, ви хочете N піддаватися більше впливу N1 ніж мимо N2.

Пам’ятайте, наскільки поперечний продукт пропорційний площі? Якщо скласти перехресні продукти, то нормалізувати суму, це зробить саме зважену суму, яку ми хочемо. Тож алгоритм стає:

For each vertex
    vertex.n := (0, 0, 0)

For each triangle ABC
    // compute the cross product and add it to each vertex
    p := cross(B-A, C-A)
    A.n += p
    B.n += p
    C.n += p

For each vertex
    vertex.n := normalize(vertex.n)

Ця методика більш докладно пояснюється в цій статті Іньїго Кілеса: розумна нормалізація сітки .


Детальніше про норми див. Також:



Це спрацювало Спасибі тонна людина, працювало саме я хотів, щоб це
Аллахане

дивіться результат тут ДО ПЕРЕД i.gyazo.com/a314d1f7a0509788c272f83279c5077b.png та ПІСЛЯ i.gyazo.com/b879db7294d82a72b86cc4eaf0132a13.png
Allahjane

@Allahjane: рада почути, що це працювало чудово. :)
Жульєн Герто
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.