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