выйти наружу нормалью из вершин - PullRequest
1 голос
/ 09 марта 2020

Я работаю над тепловым приложением в Optix, я хочу импортировать файл GLTF и затем запускать лучи из каждого примитива.

Я не полностью понял документацию, обновляющую "front" и "back" "для лиц, хранящихся в GLTF. Существует ли правильный способ вычисления нормали, обращенной наружу, с использованием трех вершин треугольника и перекрестного произведения по сторонам? Если мой код работает как задумано, я иногда получаю внутреннее, а иногда и внешнее нормальное состояние. Или порядок, в котором хранятся вершины, произвольный и, следовательно, ориентация может быть обратной? Кроме того, для каждого лица хранятся 3 «нормалей», если я правильно понимаю. Если все мои лица плоские / не изогнуты, могу ли я использовать любое из них, даже не вычисляя что-либо?

Спасибо за вашу помощь заранее!

1 Ответ

3 голосов
/ 09 марта 2020

В glTF нормали сохраняются для каждой вершины. Нормы для граней обычно рассчитываются во время растеризации (аппаратно) в большинстве графических конвейеров, как линейная интерполяция между нормалями вершин для этой грани.

Для чего стоит glTF определяет вращение против часовой стрелки в primitive.indices . Тем не менее, материалы в glTF могут быть двусторонними, и спецификация для Double Sided указывает, что при просмотре задней поверхности необходимо перевернуть нормаль перед оценкой освещения.

На практике иногда авторские инструменты создают многоугольные сетки, которые вывернуты наизнанку или даже имеют тонкостенную (не коллекторную или не водонепроницаемую) геометрию. В таких случаях может быть трудно сказать, что «внутри» и «снаружи», поскольку они выглядят одинаково, и порядок намотки может быть произвольным. (В режиме редактирования Blender выберите меню Me sh -> Normals -> Recalculate Outside, чтобы исправить это).

Для односторонних материалов порядок намотки не должен быть произвольным, так как задние стороны скрыты с точки зрения. Можно ожидать треугольников порядка намотки против часовой стрелки при использовании этих материалов. В Blender это можно сделать, выбрав движок «Eevee», открыв панель свойств материала и установив флажок «Отбор задней поверхности». Убедитесь, что это происходит в настройках материала, а НЕ в настройках области просмотра, иначе экспортер glTF не найдет его. Используйте режим просмотра «Просмотр материала», чтобы увидеть результат.

Если все мои лица плоские / не изогнуты, могу ли я использовать любое из них, даже не вычисляя что-либо?

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

...