Libgdx ModelBuilder.createRect виден только с одной стороны
В моей первой трехмерной игре libgdx я переключился с createBox
в createRect
, для создания только видимых граней (если стена находится на левой стороне другой стены, ее правая грань не видна...). Я создаю 4 модели:
frontFace
backFace
rightFace
leftFace
Они почти нарисованы так, как должны. Но есть одна большая проблема: боковые грани видны только если я смотрю в позитив z-Direction
, Если я смотрю на другую сторону (отрицательный z-Direction
), они не рисуют. Передние и задние грани только рисуют, если я смотрю на них отрицательно x-Direction
, Это как-то связано с нормой? Я установил их:
normal.x = 0;
normal.y = 1;
normal.z = 0;
Это ошибка? Как мне установить нормали? За что они стоят? У меня есть некоторая основная идея о нормальном картографировании для освещения, это то же самое?
Важное примечание: я отключил выборку задней поверхности, но это не имело никакого значения. Просмотр отсечки фрустума включен. Если вам нужна дополнительная информация, пожалуйста, оставьте комментарий, и я добавлю его как можно скорее. Спасибо
2 ответа
Возможно, не связано напрямую, но все же важно отметить: не используйте createRect или createBox для чего-либо, кроме отладки / тестирования. Вместо этого объедините несколько фигур в одну модель / узел / деталь. Или даже лучше, используйте приложение моделирования, где это возможно.
Вы не указали, как отключили выборку задних сторон. Но имейте в виду, что вы не должны изменять состояние opengl вне шейдера /rendercontext (это приведет к непредсказуемому поведению). Чтобы отключить отбраковку задней поверхности, вы можете указать ее с помощью атрибута материала IntAttribute.CullFace
(см.: https://github.com/libgdx/libgdx/wiki/Material-and-environment), Config DefaultShader (или ModelBatch по умолчанию) defaultCullFace
член (см. http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/shaders/DefaultShader.Config.html) или (не рекомендуется) статический DefaultShader#defaultCullFace
участник (см. http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/shaders/DefaultShader.html).
Лицо спереди или сзади основано на обмотке вершины. Или другими словами: порядок, в котором вы предоставляете углы прямоугольника, используется для определения того, какая сторона спереди, а какая сзади. Если вы используете один из прямоугольных методов, вы заметите, что аргументы имеют 00
, 01
, 10
или же 11
суффикс. Здесь, если смотреть на лицо, 00 слева внизу, 01 слева вверху, 11 справа вверху и 10 справа внизу.
Для прямоугольника нормальным является перпендикуляр, обращенный наружу к прямоугольнику. Например, если у вас есть прямоугольник на плоскости XZ с лицевой стороной вверху, то его нормаль равна X=0,Y=1,Z=0. Если его передняя сторона обращена к нижней части, то ее нормаль равна X=0,Y=-1,Z=0. Аналогично, если у вас есть прямоугольник на плоскости XY, его нормаль будет либо X=0,Y=0,Z=1 или X=0,Y=0,Z=-1. Обратите внимание, что нормаль не используется для выбора лица, она чаще всего используется для освещения и т. Д. Если задать неверный / противоположный нормаль, это не приведет к тому, что лицо будет отбраковано (хотя это может привести к неправильному / черному освещению).
Для вашей цели я бы рекомендовал вам использовать Decal
учебный класс. Декали - это растровые спрайты, которые существуют в 3D-сцене. Эта статья посвящена использованию наклеек в LibGDX. Я надеюсь, что это то, что вы хотели.