我正在尝试使用模板缓冲区创建具有平面平面镜的场景。当我试图在第二次渲染过程中反映我的视点时,我已经陷入了困境,如https://www.opengl.org/archives/resources/code/samples/advanced/advanced97/notes/node90.html所描绘的那样。我需要在viewmatrix上应用哪些转换才能达到预期效果?为了简化我试图在XY平面上设置平面并按(1,1,-1)缩放视图矩阵,但它不能按我的预期工作。可以指出我如何反映这个视图矩阵,以便我可以渲染镜像场景或有其他方法吗?
答案 0 :(得分:0)
此代码很简单,可能不完全正确,但对我有用。
它使用GLM。如果您不想使用GLM,可以在线查找有关此方法的信息。
bool scene::CalcMirrorMatrix (
const glm::vec3 & eyePos,
const glm::vec3 & mirrorPos,
const glm::vec3 & mirrorNormal,
float mirrorSize,
glm::mat4 & outMirrorProjMatrix,
glm::mat4 & outMirrorViewMatrix )
{
// Eye N R
// \ /\ /\
// \ | /
// \ | /
// \/|/
// ----------------- Mirror
// /
// / -R
// /
// \/
// MirrorEye
glm::vec3 eyeV (mirrorPos-eyePos); // eye to mirror center
float dist = glm::length (eyeV); // dist from eye to mirror
eyeV = glm::normalize (eyeV);
glm::vec3 N = glm::normalize (mirrorNormal);
if (glm::dot(N,eyeV) <= 0.0)
return false; // mirror looking backguards
glm::vec3 R = glm::reflect (eyeV, N); // reflected light vector, normalized.
// Position of the 'eye' inside the mirror.
glm::vec3 mirrorEyePos = mirrorPos - (R * dist);
// Mirror camera FOV (perfect square mirror)
//
// _-|
// _- | mirrorSize/2
// _- |
// mirrorEye -----------
// dist
//
float fovAngleRad = 2.0f * atanf ((mirrorSize/2.0f) / dist);
// Final matrix
outMirrorProjMatrix = glm::perspective (fovAngleRad, 1.0f, dist, cCamFarP);
outMirrorViewMatrix = glm::lookAt (mirrorEyePos, mirrorPos, glm::vec3(0.0f,1.0f,0.0f));
return true;
}