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

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

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

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

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


изменить

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

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


изменить

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


person Joey Dewd    schedule 16.01.2014    source источник
comment
Вы пытались добавить aiProcess_FixInfacingNormals к своей битовой маске?   -  person Andon M. Coleman    schedule 17.01.2014
comment
@ AndonM.Coleman, к сожалению, не сработал. Все та же проблема   -  person Joey Dewd    schedule 17.01.2014
comment
По умолчанию блендер создает цилиндр с крышками ngon, вы пытались изменить их на треугольники перед масштабированием или экспортом?   -  person sambler    schedule 17.01.2014
comment
@sambler да, я всегда экспортирую в wavefront с установленным параметром triangulate. Я отредактирую это в вопросе.   -  person Joey Dewd    schedule 17.01.2014
comment
Но как насчет ручной триангуляции и установки нормалей? экспортер может перепутать нормали при триангуляции.   -  person sambler    schedule 17.01.2014
comment
@sambler Я попытался триангулировать их в Blender и проверить их нормальные значения, и по странной причине одна из моих труб имеет правильное освещение, но другие трубы по-прежнему имеют неправильное освещение, в то время как их нормали одинаковы. Я отредактирую картинку, чтобы показать проблему   -  person Joey Dewd    schedule 17.01.2014
comment
Может ли это быть классическим случаем нормального искажения с неравномерными масштабами?   -  person mlvljr    schedule 22.09.2014
comment
@mlvljr Это довольно старый вопрос, и я считаю, что решил проблему, но, по-видимому, не создал ответа на этот вопрос. Неоднородность весов не была проблемой. Проблема заключалась в том, что обратное масштабирование объектов (которое не было видно в сцене, поскольку перевернутый цилиндр — это все тот же цилиндр) также приводило к обратному изменению нормалей. Я создам ответ на этот вопрос.   -  person Joey Dewd    schedule 22.09.2014
comment
хорошо, интересно узнать   -  person mlvljr    schedule 22.09.2014


Ответы (1)


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

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

person Joey Dewd    schedule 22.09.2014