Я создаю игру в openframeworks, где камера перемещается по стационарной 2D-плоскости в 3D-пространстве. Мне нужно выбрать 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;
}