当我尝试将坐标系的轴渲染到我的场景中时,我正面临一些透视问题。对于这些轴,我绘制了三条穿过3D立方体中心的正交线。 解释问题是非常困难的,所以我想最具说服力的方式是发布一些图片。
1)观看整个场景:click here
2)放大坐标系原点的视图:click here
3)当我进一步放大一点时,其中两个轴消失,另一个轴因某种原因似乎被取代:click here
为什么会发生这种情况?如何防止它?
我的模型视图和投影矩阵如下所示:
// 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
答案 0 :(得分:2)
那叫做“剪辑”。轴正在撞击近夹平面,因此被剪裁。第三轴没有“移位”;它只是部分修剪。拍摄第二张图像并覆盖其中的大部分图像,这样您只能看到对角轴的一部分;这就是你得到的。
有一些通用的解决方案。首先,您可能不允许用户放大那么远。或者,当摄像机移近目标对象时,您可以向内调整近剪裁平面。这也会导致远处物体的精度问题,所以你可能也想要向内调整你的远剪裁平面。
或者,您可以打开深度钳位(假设您有GL 3.x +,或访问ARB_depth_clamp或NV_depth_clamp)。这不是一个完美的解决方案,因为当他们落后于相机时,它们仍会被剪裁。如果两个这样的物体重叠,那么与近剪裁平面相交的东西将不再具有适当的深度缓冲。但它通常足够好。