我正在根据 2D 屏幕鼠标单击计算 3D 坐标。然后我在计算出的 3D 坐标处绘制点。代码中没有任何错误,方法中没有任何错误,一切都工作正常。但有一个问题与深度相关。
如果对象大小约为 (1000, 1000, 1000),我将获得完整深度,即对象面元的精确 3D 坐标。但是当我加载大小为 (20000, 20000, 20000) 的对象时,我无法获得准确的(深度)3D 坐标。我从表面得到了一些偏移。绘制的点与表面有一定的偏移。所以我的第一个问题是为什么会发生这种情况?第二个问题是如何获得超大型物体的完整深度和准确的 3D 坐标?
我用
绘制 3D 点glDepthFunc(GL_LEQUAL);
glDepthRange(0.0, 0.999999);
并使用
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz);
if(wz > 0.0000001f && wz < 0.999999f)
{
gluUnProject()....saving 3D coordinate
}
最佳答案
发生这种情况的原因是深度缓冲区的精度有限。例如,8 位深度缓冲区只能存储 2^8=256 个不同的深度值。
影响深度精度的第二个参数集是投影中近平面和远平面的设置,因为这是必须映射到深度缓冲区中的可用数据值的范围。如果使用 8 位深度缓冲区将此范围设置为 [0, 100],则实际精度为 100/256 = ~0.39,这意味着眼睛空间中大约 0.39 个单位将分配相同的深度值。/p>
现在解决您的问题:很可能您分配给深度缓冲区的位数太少。如上所述,这会引入错误,因为无法存储精确的深度值。这就是为什么这些点靠近表面,但不完全在表面上。
关于opengl - 如何在 OpenGL 中通过 2D 屏幕鼠标单击大型对象获得准确的 3D 深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30741975/