我正在openframeworks中构建一个游戏,摄像机在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;
}
答案 0 :(得分:3)
但是我发现gluUnproject功能太慢了。
仅仅转换5个坐标不应成为性能瓶颈。
我想在不使用gluUnproject的情况下将屏幕坐标转换为平面上的未投影坐标。
您必须确定逆转换路径。那就是:反转描述从模型空间到视图空间的方式的矩阵(并且在某些时候反转透视间隔)然后将坐标传递到它中。但是,这正是gluUnproject所做的。