我对ndc与屏幕坐标系之间的关系感到困惑。 我做的是
选择屏幕坐标(例如屏幕上的触摸点)。
然后将屏幕坐标传递给gluUnproject。我将深度变量(gluUnproject的第三个变量)设置为0.0f。
然后我将对象坐标乘以modelviewmatrix和projectionmatrix。
之后我剪掉了空间。然后我将剪辑空间坐标与W
在此之后我将gluUnproject的第三个变量更改为1.0f,我认为结果等于0.0f。但结果是1.0f。
所以这里是标准化坐标系和屏幕坐标系之间关系的问题。如何设置gluUnproject函数的深度变量?
答案 0 :(得分:3)
标准化坐标系与屏幕坐标系之间的关系是什么?
标准化的设备坐标以[-1,+ 1]的范围表示,并从剪辑空间坐标中获得,除以它们的W分量。
它们通过视口参数和深度范围参数在窗口空间坐标中进行变换。
如何设置gluUnproject函数的深度变量?
如果要将窗口空间坐标转换回规范化设备坐标,则需要在要转换的点处使用窗口空间z值。所以,直接来自OpenGL FAQs:
GLdouble z;
glReadPixels (x, y, 1, 1, GL_DEPTH_COMPONENT, GL_DOUBLE, &z);
请注意,OpenGL在深度缓冲区中存储非线性深度。