Libgdx ModelBuilder.createRect виден только с одной стороны

В моей первой трехмерной игре libgdx я переключился с createBox в createRect, для создания только видимых граней (если стена находится на левой стороне другой стены, ее правая грань не видна...). Я создаю 4 модели:

  1. frontFace
  2. backFace
  3. rightFace
  4. 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. Я надеюсь, что это то, что вы хотели.

Другие вопросы по тегам