C++ 剔除截锥体向上或向下看时变窄
我在OpenGL中实现截锥剔除时遇到问题。 我使用本教程在世界空间中实现了平面提取(引擎的其余部分来自learnopengl.com)。 它工作得很好,但只有当相机指向地平线时。如果相机指向上或下,平截头体将逐渐变窄 事实上,当指向地平线时,远平截体平面大小为1023*828,但当指向上或下时,远平截体平面大小仅为17*14。同样的问题也发生在近平截头体平面上 下面是每帧更新平截头体的代码(C++): 结果如下:C++ 剔除截锥体向上或向下看时变窄,c++,opengl,3d,glm-math,culling,C++,Opengl,3d,Glm Math,Culling,我在OpenGL中实现截锥剔除时遇到问题。 我使用本教程在世界空间中实现了平面提取(引擎的其余部分来自learnopengl.com)。 它工作得很好,但只有当相机指向地平线时。如果相机指向上或下,平截头体将逐渐变窄 事实上,当指向地平线时,远平截体平面大小为1023*828,但当指向上或下时,远平截体平面大小仅为17*14。同样的问题也发生在近平截头体平面上 下面是每帧更新平截头体的代码(C++): 结果如下: 问题是由于cameraUp和cameraRight值未标准化 tang = (
问题是由于cameraUp和cameraRight值未标准化
tang = (float) tan(glm::radians(45.0f) * 0.5f);
ratio = SCR_WIDTH * 1.0 / SCR_HEIGHT;
// Direction vectors
cameraZ = cameraFront * -1.0f;
cameraRight = glm::cross(glm::vec3(0.0f, 1.0f, 0.0f), cameraZ);
cameraUp = glm::cross(cameraZ, cameraRight);
// Dimensions of near and far frustum planes
Hnear = nearDist * tang; // Hnear = near plane height
Wnear = Hnear * ratio; // Wnear = near plane width
Hfar = farDist * tang; // Hfar = far plane height
Wfar = Hfar * ratio; // Wfar = far plane width
// Distance of near and far planes
fc = cameraPos - cameraZ * farDist; // fc = far center
nc = cameraPos - cameraZ * nearDist; // nc = near center
// Extraction of frustum points
ntl = nc + (cameraUp * Hnear) - (cameraRight * Wnear);
ntr = nc + (cameraUp * Hnear) + (cameraRight * Wnear);
nbl = nc - (cameraUp * Hnear) - (cameraRight * Wnear);
nbr = nc - (cameraUp * Hnear) + (cameraRight * Wnear);
ftl = fc + (cameraUp * Hfar) - (cameraRight * Wfar);
ftr = fc + (cameraUp * Hfar) + (cameraRight * Wfar);
fbl = fc - (cameraUp * Hfar) - (cameraRight * Wfar);
fbr = fc - (cameraUp * Hfar) + (cameraRight * Wfar);
// Computation of the 6 frustum planes
topPlane = {ntr,ntl,ftl};
bottomPlane = {nbl,nbr,fbr};
leftPlane = {ntl,nbl,fbl};
rightPlane = {nbr,ntr,fbr};
nearPlane = {ntl,ntr,nbr};
farPlane = {ftr,ftl,fbl};