Объект, загруженный через OpenGL Assimp, иногда инвертирует нормали

В настоящее время я пытаюсь заставить освещение работать на объекте цилиндра, сделанном в блендере (базовый цилиндр масштабирован по оси z, дальнейшая обработка не выполняется), и загрузить этот объект через Assimp со следующими параметрами aiProcess_GenSmoothNormals | aiProcess_Triangulate | aiProcess_CalcTangentSpace | aiProcess_FlipUVs, В опциях экспорта волнового фронта блендера triangulate опция установлена.

Проблема заключается в некотором масштабировании, выполняемом на цилиндре (обычно выше определенного порога масштабирования), моя реализация OpenGL показывает инвертированные нормали (у меня есть геометрический шейдер, который показывает нормали), и поскольку он инвертирует нормали, освещение также инвертируется. Это происходит только с этими цилиндрическими объектами с определенным масштабированием (по крайней мере, только тогда это произошло со мной). Любой другой объект в моей сцене работает нормально, кроме этих цилиндров.

Я понятия не имею, связано ли это с тем, как Assimp загружает файлы .obj, или как blender обрабатывает нормали при экспорте, или, может быть, это связано с большим z-масштабом, так как он разрушает нормальную интерполяцию или что-то еще? Ниже вы найдете изображение инвертированных нормалей (слева) и правильных нормалей (справа), где у объекта с инверсией нормали большой z-масштаб, выполненный с помощью блендера.

неверные и правильные нормы


редактировать

На этот раз я вручную триангулировал цилиндры в блендере и проверил их нормали. Нормы всех цилиндров правильные и затем экспортируются как есть. Тем не менее, одна труба теперь имеет правильное освещение, но у других труб все еще имеют инвертированные нормали, в то время как они имеют ту же триангуляцию, что и рабочая труба, что вызывает путаницу. На следующем рисунке показаны нормали цилиндров.

Нормы труб в блендере


редактировать

Хорошо, я кое-что понял. Как только я начал масштабировать правильно освещенную трубу до того же масштаба, что и неправильная труба (левая), тогда нормали правильной трубы снова были инвертированы (в моей программе OpenGL, в Blender, нормали по-прежнему выглядят нормально). Так что шкала длины цилиндров определенно имеет отношение к инверсии их нормалей, хотя я не знаю, что это может быть.

5

Решение

Проблема с инвертированными нормалями была вызвана обратной шкалой в Blender. При уменьшении масштаба ниже 0 Порог, объект начинает расти снова (с отрицательной шкалой), который не был сразу виден из-за того, что цилиндр с обратным масштабированием выглядит так же, как цилиндр с нормальным масштабированием.

Из-за того, как работает масштабирование блендера, некоторые движения мыши имеют тенденцию внезапно переходить от положительной шкалы к отрицательной шкале при масштабировании, что приводило к отрицательному масштабированию некоторых моих цилиндров. Отрицательно масштабированный цилиндр имеет инвертированные нормали при экспорте объекта в .obj, Я бы назвал это ошибкой в ​​Blender, так как это не было видно из нормалей, которые показывал сам Blender (они выглядели правильно).

2

Другие решения

Других решений пока нет …