Матрица отражения не работает должным образом

0

Я пробовал этот учебник, и вот как я создаю и использую матрицу отражения (моя водная плоскость z = 0):

glm::mat4 mReflection = glm::mat4
    (
    1.0, 0.0, 0.0, 0.0,
    0.0, 1.0, 0.0, 0.0,
    0.0, 0.0, -1.0, 0.0,
    0.0, 0.0, 0.0, 1.0
    );

camera.setViewMatrix(mReflection * camera.View());
glCullFace(GL_FRONT);

шейдер:

vec4 mvpvertex = MVP_reflection * vec4(vertex, 1.0);
vec2 projCoord = mvpvertex.xy / mvpvertex.w;
projCoord = vec2(0.5, 0.5) + 0.5 * projCoord;
projCoord = clamp(projCoord, 0.0, 1.0);

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

Теги:
opengl
matrix

1 ответ

1
Лучший ответ

Поскольку вы умножаете матрицу отражения слева, это означает, что она применяется после матрицы вида. Таким образом, отражение в направлении z, которое определяет ваша матрица, будет переворачиваться спереди и сзади.

Я думаю, у вас есть два варианта исправить это:

  1. Примените отражение перед преобразованием вида. Синус - плоскость воды при z = 0 в вашем мировом пространстве, тогда отражение в направлении z будет правильным. Для этого вы можете сделать часть отражения вашей трансформации модели (если она есть в коде не показана) или заменить порядок умножения:

    camera.setViewMatrix(camera.View(), mReflection);
    
  2. Поскольку вы говорите об отражении воды, я полагаю, что отражение сворачивается вверх-вниз, которое (если вы не используете очень необычную матрицу прогноза) - это направление y после того, как были применены преобразования модели и вида. Поэтому, если вы хотите применить отражение после преобразования вида, вам нужно у-отражение:

    1.0,  0.0, 0.0, 0.0,
    0.0, -1.0, 0.0, 0.0,
    0.0,  0.0, 1.0, 0.0,
    0.0,  0.0, 0.0, 1.0
    

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню