1

我正在开放框架中构建一个游戏,其中相机在 3d 空间中的静止 2d 平面上移动。我需要为每一帧选择 5 个坐标,因为相机总是在移动(1 个用于鼠标,4 个用于视口角以锻炼要绘制的内容)。但是我发现 gluUnproject 函数太慢了。由于我只在固定平面上选择坐标,目前在 Z = 0 上,我认为我应该能够通过使用我的相机类中的模型视图和投影矩阵非常便宜地计算出我的坐标,但我就是无法解决如何做数学。

总结一下,我有

相机 - MODELVIEW 和 PROJECTION 矩阵,VIEWPORT 平面与 z 轴对齐,尺寸为 world_dims.x、world_dims.y

我想在不使用 gluUnproject 的情况下将屏幕坐标转换为平面上的未投影坐标。

以防我对我的 gluUnproject 感到愚蠢,这是该位的代码

ofVec3f ofxGrabCam::pickCoordinate(ofVec2f t_mouseP) {
//read z value from depth buffer at mouse coords

ofVec3f t_mouseW(t_mouseP.x, t_mouseP.y, 0);

glReadPixels(t_mouseW.x, ofGetScreenHeight()-1-t_mouseP.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &t_mouseW.z);

if (t_mouseW.z == 1.0f){
    return ofVec3f(-99,-99,-99); //represents point not found
}

GLdouble c[3];

gluUnProject(t_mouseW.x, ofGetScreenHeight()-1-t_mouseW.y, t_mouseW.z, matM, matP, viewport, c, c+1, c+2);

ofVec3f mouseW(c[0],c[1],c[2]);

return mouseW;

}

4

1 回答 1

3

但是我发现 gluUnproject 函数太慢了。

仅反向转换 5 个坐标不应成为性能瓶颈。

我想在不使用 gluUnproject 的情况下将屏幕坐标转换为平面上的未投影坐标。

您必须确定逆变换路径。那就是:反转描述从模型空间到视图空间的方式的矩阵,(并在某些时候反转透视划分)然后将坐标传递给它。然而,这正是 gluUnproject 所做的。

于 2012-03-09T14:14:43.753 回答