OpenGL 中 3D 坐标系的透视问题



我目前在尝试将坐标系的轴渲染到场景中时遇到了一些透视问题。对于这些轴,我绘制了三条穿过 3D 立方体中心的正交线。很难解释问题是什么,所以我想最能说明问题的方式是发布一些图片。

1)全场景查看:点击这里

2) 放大坐标系原点视图:单击此处

3)当我进一步放大一点时,其中两个轴消失了,另一个轴似乎由于某种原因而移位:点击这里

为什么会发生这种情况,我该如何防止?

我的模型视图和投影矩阵如下所示:

 // Set ProjectionMatrix
projectionMatrix = glm::perspective(90.0f, (GLfloat)width / (GLfloat) height, 0.0001f, 1000.f);
glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projectionMatrix));
glBindBuffer(GL_UNIFORM_BUFFER, 0);
// Set ModelViewMatrix
glm::mat4 identity        = glm::mat4(1.0); // Start with the identity as the transformation matrix
glm::mat4 pointTranslateZ = glm::translate(identity, glm::vec3(0.0f, 0.0f, -translate_z)); // Zoom in or out by translating in z-direction based on user input 
glm::mat4 viewRotateX     = glm::rotate(pointTranslateZ, rotate_x, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the whole szene in x-direction based on user input
glm::mat4 viewRotateY     = glm::rotate(viewRotateX,  rotate_y, glm::vec3(0.0f, 1.0f, 0.0f)); // Rotate the whole szene in y-direction based on user input
glm::mat4 pointRotateX    = glm::rotate(viewRotateY, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the camera by 90 degrees in negative x-direction to get a frontal look on the szene
glm::mat4 viewTranslate   = glm::translate(pointRotateX, glm::vec3(-dimensionX/2.0f, -dimensionY/2.0f, -dimensionZ/2.0f)); // Translate the origin to be the center of the cube

称为"剪辑"。轴正在撞击近裁剪平面,因此正在被裁剪。第三个轴不是"位移";它只是部分被剪掉了。拿你的第二张图片并覆盖大部分,这样你只能看到对角线轴的一部分;这就是你得到的。

对此有一些通用解决方案。首先,您可以不允许用户放大那么远。或者,当摄像机靠近目标对象时,您可以向内调整近剪辑平面。这也会导致远处对象的精度问题,因此您可能还需要向内调整远处裁剪平面。

或者,

您可以只打开深度钳夹(假设您有 GL 3.x+,或者可以访问ARB_depth_clamp或NV_depth_clamp)。这不是一个完美的解决方案,因为当它们进入相机后面时,它们仍然会被剪辑。如果两个这样的对象重叠,与近剪辑平面相交的事物将不再具有适当的深度缓冲。但总的来说已经足够好了。

最新更新