OpenGL - переместить камеру внутрь скайбокса

У меня есть скайбокс и я обнаружил, что внутри него невозможно двигаться (только вращаться, не приближаться к человеку внутри него или около того, это не зум, это именно движение), как написано в этом туториале https://learnopengl.com/#!Advanced-OpenGL/Cubemaps. Как только я включаю перевод для камеры, скайбокс становится довольно уродливым, с углами и всеми сторонами, поэтому идея перемещать камеру и одновременно перемещать скайбокс не очень хороша. Какое решение подходит? Я думаю, что это довольно очевидная проблема, но я нигде не могу найти решения. Или, может быть, мне нужно использовать для этой цели другую конструкцию, а не скайбокс.введите здесь описание изображения

введите здесь описание изображения

вот два состояния - первое, которое я получаю, когда включен перевод. Я хочу на втором изображении приблизиться к горам.


person Skotti Bendler    schedule 11.04.2017    source источник
comment
Здесь многое может пойти не так. Трудно будет помочь, хотя бы не увидев скриншот.   -  person jimvonmoon    schedule 11.04.2017
comment
@jimvonmoon, я скачал картинки, но сам код довольно большой, и в основном он такой же, как в учебнике   -  person Skotti Bendler    schedule 11.04.2017
comment
Перемещение по скайбоксу как бы противоречит общей цели скайбокса. В отношении учебника это также предполагаемое поведение.   -  person vallentin    schedule 11.04.2017
comment
@Vallentin, тогда скайбоксы не применяются к задачам, когда я хочу перемещать камеру влево и вправо, назад и вперед? Разве перемещение скайбокса с камерой не является подходящим решением (мне не удалось заставить его работать)?   -  person Skotti Bendler    schedule 11.04.2017
comment
Я не уверен, что вы говорите и в чем собственно вопрос. Неподвижный скайбокс ничего не изменит. Поскольку камера тоже не движется, технически движется весь остальной мир.   -  person vallentin    schedule 11.04.2017
comment
вам нужно визуализировать скайбокс с его центром так же, как и положение камеры ... игнорируя любые смещения смещения ... если вы используете другое положение, вы можете получить такие проблемы, как пересечение zfar, приближение к краям скайбокса и т. д. ...   -  person Spektre    schedule 11.04.2017


Ответы (1)


Несмотря на то, что этому вопросу несколько лет, решение этой проблемы заключается в том, что вы должны установить матрицу представления ПОСЛЕ, когда вы «используете» свой шейдер для скайбокса. Вы не можете просто установить матрицу представления один раз в своем цикле и ожидать, что будете работать со всеми шейдерами, имеющими униформу представления.

Итак, проблема в том, что у OP есть что-то подобное, основанное на учебнике в основном цикле:

    glm::mat4 view = mCamera.GetViewMatrix(); 

    glDepthFunc(GL_LEQUAL);  
    mSkyboxShader.Use();
    mSkyboxShader.SetMat4("view", view);
    mSkyboxShader.SetMat4("projection", projection);
    mSkybox.Render(mSkyboxTexture);
    glDepthFunc(GL_LESS);

Независимо от кода, это рассматривает ваш скайбокс как любой другой объект, к которому вы можете перемещаться. Решение:

glm::mat4 view = mCamera.GetViewMatrix(); 

glDepthFunc(GL_LEQUAL);  
mSkyboxShader.Use();
view = mCamera.GetViewMatrix(); <----Solution
mSkyboxShader.SetMat4("view", view);
...

Вы должны обновить представление после активации шейдера, прежде чем применять его к юниформе для каждой шейдерной программы, которой требуется матрица представления.

person Community    schedule 08.12.2017
comment
Не могли бы вы объяснить, почему вы не можете повторно использовать матрицу представления? Матрица представления не должна зависеть от шейдера, поэтому, если OP не изменила свое значение между вызовами GetViewMatrix и SetMat4, я не вижу в этом проблемы. - person JamJar00; 10.05.2018