OpenGl, язык C. Мировые координаты через gluUnProject и их сдвиг от glRotatef
Работаю с перспективной проекцией. Пытаюсь получить мировые координаты в месте клика мышью через функцию gluUnProject(). Но координаты смещаются из-за использования glRotatef и glTranslatef для движения "камеры".
С glTranslatef все понятно: просто отнять координаты, на которые смещаешь, а что делать с glRotatef?
Пока я не двигаю изображение при помощи glRotatef, все работает исправно, но вот с ним проблема.
На данный момент имею такую функцию:
glRotatef(-camera.xAngle, 1,0,0);
glRotatef(-camera.zAngle, 0,0,1);
glTranslatef(-camera_pos.x, -camera_pos.y, -camera_pos.z);
void ClientToOpenGlCoords(int x, int y, double *ox, double *oy, double *oz) {
GLint vp[4];
GLdouble mMatrix[16], pMatrix[16];
float z;
glGetIntegerv(GL_VIEWPORT, vp);
y = vp[3] - y - 1;
glGetDoublev(GL_MODELVIEW_MATRIX, mMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, pMatrix);
glReadPixels(x, y, 1,1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);
gluUnProject(x, y, z, mMatrix, pMatrix, vp, ox, oy, oz);
*ox += camera_pos.x;
*oy += camera_pos.y;
}
Пытался читать про матрицу MODELVIEW, но, видимо, моего понимания не хватает. Подскажите, что мне нужно использовать, чтобы учитывать сдвиг и от glRotatef.
Ответы (1 шт):
Не уверен почему именно так работает, но пришел к такому решению:
glRotatef(-camera.xAngle, 1,0,0);
glRotatef(-camera.zAngle, 0,0,1);
glTranslatef(-camera_pos.x, -camera_pos.y, -camera_pos.z);
void ClientToOpenGlCoords(int x, int y, double *ox, double *oy, double *oz) {
GLint vp[4];
GLdouble mMatrix[16], pMatrix[16];
float z;
glPushMatrix();
glRotatef(-camera.xAngle, 1,0,0);
glRotatef(-camera.zAngle, 0,0,1);
glTranslatef(-camera_pos.x, -camera_pos.y, -camera_pos.z);
glGetDoublev(GL_MODELVIEW_MATRIX, mMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, pMatrix);
glGetIntegerv(GL_VIEWPORT, vp);
y = vp[3] - y;
glReadPixels(x, y, 1,1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);
gluUnProject(x, y, z, mMatrix, pMatrix, vp, ox, oy, oz);
glPopMatrix();
}
Ранее, при использовании функции, я использовал glPushMatrix и glPopMatrix, без них изображение сдвигалось при каждом нажатии мыши, сейчас я внес их в саму функцию, и добавил смещение камеры еще раз (так как матрицы получались единичные). Что интересно, без glPushMatrix и glPopMatrix, и заново перемещений камеры, не работает, ибо происходит смещение, видимо в вышеописанных функциях что-то меняет наши матрицы GL_MODELVIEW_MATRIX и GL_PROJECTION_MATRIX. Так что вот, что понял - расписал.