2

我目前在尝试将坐标系的轴渲染到我的场景中时遇到了一些透视问题。对于这些轴,我绘制了三个穿过 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
4

1 回答 1

2

这就是所谓的“剪辑”。轴撞击近剪裁平面,因此被剪裁。第三轴没有“位移”;它只是被部分剪裁。拍摄第二张图像并将其大部分覆盖,这样您只能看到对角轴的一部分;这就是你得到的。

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

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

于 2013-01-24T20:12:49.503 回答