在翻译的平面中反射相机

时间:2014-10-28 16:00:11

标签: c++ opengl 3d

我有飞机z = 0,想在这架飞机上反射我的相机。我的代码运行良好,只要我不沿z轴平移平面。 我目前的尝试看起来像这样:

//transform the plane in world coordinates
vec4 waterPlane = modelMatrix.inverse().transpose() * vec4(0.0, 0.0, 1.0, 0.0);
//calculate reflection matrix
mat4 mReflection = mat4
(
  1.0 - 2.0 * waterPlane.getX() * waterPlane.getX(), -2.0 * waterPlane.getX() * waterPlane.getY(), -2.0 * waterPlane.getX() * waterPlane.getZ(), -2.0 * waterPlane.getX() * waterPlane.getL(),
  -2.0 * waterPlane.getX() * waterPlane.getY(), 1.0 - 2.0 * waterPlane.getY() * waterPlane.getY(), -2.0 * waterPlane.getY() * waterPlane.getZ(), -2.0 * waterPlane.getY() * waterPlane.getL(),
  -2.0 * waterPlane.getX() * waterPlane.getZ(), -2.0 * waterPlane.getY() * waterPlane.getZ(), 1.0 - 2.0 * waterPlane.getZ() * waterPlane.getZ(), -2.0 * waterPlane.getZ() * waterPlane.getL(),
  0.0, 0.0, 0.0, 1.0
  );
//set new camera position
camera.from = mReflection * camera.from;
camera.at = mReflection * camera.at;
camera.up = mReflection * camera.up;

(投影)纹理坐标在着色器中以这种方式计算:

vec4 mvpvertex = mvp * vec4(vertex, 1.0);
vec4 tmp = vec4(1.0 / mvpvertex.w);
vec4 projCoord = mvpvertex * tmp;
projCoord += vec4(1.0);
projCoord *= vec4(0.5);
projCoord = clamp(projCoord, 0.0, 1.0);
//without this line, my reflection would be mirrored along the middle of the screen
projCoord.x = 1.0 - projCoord.x;
vec2 texCoord = projCoord.xy;

使用此代码,我可以借助模型矩阵旋转我的平面,一切正常。但是如果我想沿着z轴平移平面,那么我的飞机看起来可能像z = 1,反射看起来不再正确。 新的相机位置是正确计算的(使用调试器进行测试),但我认为这一行会产生问题:projCoord.x = 1.0 - projCoord.x;

我添加了它,因为否则我的反射沿着屏幕中间的y轴镜像。但我不知道我怎么能以另一种方式做到这一点。 所以任何人都知道如何解决我的问题?

0 个答案:

没有答案