Более 1 нормали на вершину - PullRequest
2 голосов
/ 19 марта 2012

Я немного запутался с нормалями, экспортированными из блендера в файл .obj Я делаю приложение win, чтобы разделить obj-файл на 2 файла: 1 с вершинами, а другой с индексами, поэтому у opengl меньше работы. как я вижу в лицах, я могу найти то же лицо, но с другим нормальным например, лицо 24/24/20 и снова 24/24/19 и, возможно, больше Это правильно? В проекте Blender есть только 1 источник света. Спасибо

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Я сделал несколько тестов, и вот как я их вижу:

Скрипт экспорта OBJ игнорирует нормали вершин и вместо этого использует нормали граней.

Для проверки Iсделал простую форму, из двух треугольников, как на этом изображении:

enter image description here

И экспортирован в OBJ.Вы должны ожидать 4 векторных нормали (vn), так как у вас есть 4 вектора, или 3, если они оптимизированы, потому что 2 вектора в середине одинаковы.Но вместо этого он выдает только 2 vn-s:

vn -0.000000 1.000000 0.000000
vn -1.000000 -0.000000 -0.000000

Более того, если вы посмотрите на определения лиц, вы найдете что-то более интересное:

f 1 // 1 4 // 1 3 // 1

f 4 // 2 2 // 2 3 // 2

Посмотрите на числа после // в одной строке.Они одинаковые.Это означает, что для всех вершин внутри одной грани используется одна и та же нормаль.Это значит, что это не нормали вершин, а нормали граней.Так вот почему присваивает разные нормали для одних и тех же вершин.Когда вершины нет.4 используется для определения первого лица, получающего нормаль первого лица, а когда оно используется для определения 2-го лица, используется нормаль 2-го лица.

РЕДАКТИРОВАТЬ Вы можете вычислить нормаль вершины по следующим параметрам:

  • Найти все вхождения вершины и получить все ее нормали в набор A
  • Добавьте соответствующие координаты нормали: vn = (x1 + x2 + ... + xn, y1 + y2 + ... + yn, z1 + z2 + ... + zn)
  • Вычислить длину вектора: h = sqrt (vnx ^ 2 + vny ^ 2 + vnz ^ 2)
  • Нормализовать вектор vn: vn = (vnx / h, vny / h, vnz / h)

Используя мой предыдущий пример (найденный на изображении), вектор сверху и снизу встречается только один раз, поэтому вам не нужно ничего делать (нормаль вершины совпадает снормальное лицо).На вершинах посередине: они встречаются дважды, один раз для верхнего треугольника с нормалью (0, 1, 0) и для нижнего (-1, 0, 0), таким образом, наши наборы нормалей для этих вершин являются {(0, 1, 0), (-1, 0, 0)}.Добавление этих значений дает: (0 - 1, 1 + 0, 0 + 0) = (-1, 1, 0).Расчет длины: h = sqrt ((- 1) ^ 2 + 1 ^ 2) = sqrt (2).Деление вектора на него дает норму (vn) = vn / h = (-1 / sqrt (2), 1 / sqrt (2), 0).Если вы посмотрите на картинку на переднем орто (в верхнем левом углу) в средней нормали, вы увидите, что она имеет равные компоненты -x и + y, а вектор имеет длину 1. Вы можете видеть, что наш результат имеет длину1, снова рассчитав его длину: 1/2 + 1/2 + 0 = 1. Поэтому нам пришлось нормализовать, чтобы получить длину 1.

2 голосов
/ 23 марта 2012

@ SinistraD Спасибо за ваши комментарии. они действительно очень полезны. После попытки выяснить, как экспортировать из blender для каждой нормали вершины, я обнаружил, что есть опция в инструментах объекта> затенение> гладкая или плоская. Если вы выберете «Сглаживание», а затем экспортируете объект как файл obj, нормали будут на каждую вершину, я пока не пробую это сделать в моем проекте (сейчас я строю шейдеры), но я скоро это сделаю. см. пример экспортированного куба с этим методом.

Blender v2.61 (sub 0) OBJ File: ''

www.blender.org

v 11.209502 -11.209502 -11.209501
v 11.209502 -11.209502 11.209502
v -11.209503 -11.209502 11.209500
v -11.209498 -11.209502 -11.209506
v 11.209508 11.209502 -11.209496
v 11.209495 11.209502 11.209509
v -11.209506 11.209502 11.209498
v -11.209501 11.209502 -11.209502
vt 0,652335 0,642748
vt 0,653298 0,956858
vt 0,339188 0,957821
vt 0,338225 0,643711
вт 0,968372 0,643711
vt 0,967408 0,957821
vt 0,654262 0,642748
vt 0,967408 0,327674
вт 0,968372 0,641784
vt 0,653298 0,328638
vt 0,339188 0,642748
vt 0,338225 0,328638
vt 0,652335 0,327674
vt 0,653298 0,641784
vt 0,337261 0,642748
vt 0,338225 0,956858
vt 0,024115 0,957821
vt 0,023151 0,643711
vt 0,337261 0,327674
vt 0,338225 0,641784
vt 0,024115 0,642748
vt 0,023151 0,328638
vn 0,577349 -0,577349 -0,577349
vn 0.577349 -0.577349 0.577349
vn -0,577349 -0,577349 0,577349
vn -0,577349 -0,577349 -0,577349
вн 0.577349 0.577349 -0.577349
vn -0,577349 0,577349 -0,577349
vn -0,577349 0,577349 0,577349
вн 0.577349 0.577349 0.577349
с 1
f 1/1/1 2/2/2 3/3/3 4/4/4
f 5/5/5 8/6/6 7/2/7 6/7/8
f 1/8/1 5/9/5 6/7/8 2/10/2
f 2/11/2 6/12/8 7/13/7 3/14/3
f 3/15/3 7/16/7 8/17/6 4/18/4
f 5/19/5 1/20/1 4/21/4 8/22/6

...