Движение OpenGLSkybox (CubeMap) вместе с движением камеры

Я следил за некоторыми учебными пособиями OpenGL для проекта с открытым миром, над которым я сейчас работаю, где цель состоит в том, чтобы иметь сцену открытого мира с несколькими объектами (горы и т. д.) и с SkyBox, где все объекты размещены внутри него.

Я хотел бы спросить, есть ли способ, чтобы камера свободно перемещалась внутри скайбокса, «взаимодействуя» с потенциальными объектами в нем, но фактически не выходя за границы бокса. В туториалах удален перевод камеры, поэтому она может только осматриваться, не двигаясь.

Является ли обычной практикой перемещение камеры внутри скайбокса, или я должен каким-то образом перемещать скайбокс вместе с камерой, никогда не достигая границ скайбокса?


person Coolshady    schedule 21.11.2018    source источник


Ответы (2)


Skybox обычно рендерится без смещения относительно камеры, потому что его содержимое представляет объекты, находящиеся очень далеко (во много раз превышающие фактическое движение камеры), например, звезды или горы, которые находятся за много километров. Таким образом, даже если вы переместитесь примерно на 100 м в любом направлении, результат рендеринга вообще не изменится (или очень мало, что невозможно распознать).

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

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

person Spektre    schedule 22.11.2018

Во-первых, когда вы рендерите скайбокс, как правило, вы не рендерите настоящий бокс.

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

Если скайбокс динамический, например, динамическое время суток, он перерисовывается только каждые пару кадров или только тогда, когда это необходимо.

Некоторое время назад я написал статью о том, как это сделать: GLSL Skybox (Вам нужно будет обновить код до современной версии OpenGL через...)

person rioki    schedule 23.11.2018