2014-09-10 94 views
0

我试图this tutorial,这是我如何创建和使用反射矩阵(我的水平面为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); 

但整个场景似乎被翻转过来。我应该在我面前看到反射的东西在我身后,反之亦然。我尝试了一些更多的矩阵转换,但没有,如果我的尝试工作。 我在做什么错,我该如何解决?

回答

1

由于您将左边的反射矩阵相乘,这意味着它应用在视图矩阵之后。因此,在您的矩阵定义的z方向上的反射会翻转正面和背面。

我认为你有两个选择来解决这个问题:

  1. 应用视图改造前的反射。正弦水平面在z = 0的世界空间中,反射在z方向上则是正确的。要做到这一点,你既可以让你的模式转型的反射部分(如果你有一个在代码中未显示),或交换乘的顺序:

    camera.setViewMatrix(camera.View(), mReflection); 
    
  2. 既然你是在谈论一个水反射,我认为反射互换上下,其中(除非你使用非常不寻常的投影矩阵)是应用了模型和视图转换后的y方向。所以,如果你想申请的视角变换后的反射,你需要一个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 
    

我没有研究过你在下面的详细教程,所以我不知道这两种选择中的哪一种在上下文中会更好地发挥作用。从表面看,似乎他们实际上最终翻转了两次,在视图转换之前和之后。你将不得不弄清细节,但我希望这将解决你的主要障碍。

上面假设您正在使用以最标准方式运行的矩阵库,其中矩阵是为向量从右边开始构建的。如果您使用行主矩阵进行操作,则乘法顺序将恢复,然后在将矩阵提供给着色器时将其转置。