关于OpenGL:GlunProject更便宜的选择

glunproject cheaper alternative

我在OpenFrameworks中构建了一个游戏,在这个游戏中,一个摄像头在三维空间中的静止二维平面上移动。我需要为每一帧选择5个坐标,因为相机总是在移动(1个用于鼠标,4个用于观察窗的角落,以训练要绘制的内容)。但是我发现这个忧郁的功能太慢了。因为我只在一个静止的平面上选取坐标,现在z=0,我想我应该可以通过使用我的相机类中的模型视图和投影矩阵来非常便宜地计算出我的坐标,但是我无法计算出如何计算。

总之,我有

相机-模型视图和投影矩阵,视区与Z轴对齐的平面,尺寸为world_dims.x,world_dims.y

我想将屏幕坐标转换为平面上的未投影坐标,而不使用Glunproject。

如果我对自己的忧郁感到迟钝的话,这里是这一点的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;

}


However I've found the gluUnproject function too slow.

只有5个坐标的后向转换不应该成为性能瓶颈。

I want to transform screen coordinates into unprojected coordinates on the plane without using gluUnproject.

你必须确定逆变换的路径。也就是说,将描述从模型空间到视图空间的方式的矩阵颠倒过来,(在某一点上,将透视图分割过来),然后传递到坐标中。然而,这正是Glunpunt所做的。