У меня очень простая программа с моим представителем OpenGL. У меня есть 3d вершина на экране, и вся система вращается вдоль оси Y.
float rotation =0;
//update function
rotation = rotation +1;
Функция draw выглядит примерно так:
glPushMatrix();
glTranslatef(500,390,0);
glRotatef(rotation,0.0,1.0,0.0);
glVertex3d(365,50,0);
glPopMatrix();
Когда glVertex вращается, его положение на экране меняется очевидно. Но координат самой точки нет. Как я могу получить current
координаты точки на экране, которая была повернута glRotatef
когда их «фактические» координаты стационарны?
Как получить текущие координаты точки на экране, которая была повернута glRotatef, когда их «фактические» координаты являются стационарными?
Вы должны имитировать конвейер преобразования OpenGL. Поскольку вы используете старую фиксированную функцию OpenGL, я покажу вам, как это сделать с помощью старой и старой GLU:
Сначала нам нужен текущий видовой экран и матрица проекции
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
GLdouble projection[16];
glMatrixMode(GL_PROJECTION);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef(500,390,0);
glRotatef(rotation,0.0,1.0,0.0);
в этот момент матрица вида модели содержит примененное преобразование вида модели, так что получите и это.
GLdouble modelview[16];
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
Теперь у нас есть все, чтобы спроецировать это.
GLdouble obj_x, obj_y, obj_z; // point coordinates
GLdouble win_x, win_y, win_z; // receives window coordinates
gluProject( obj_x, obj_y, obj_z,
modelview, projection, viewport,
&win_x, &win_y, &win_z );
Вот и ты. Я рекомендую посмотреть на исходный код gluProject, предоставленный MesaGL. Но в основном это следующие шаги:
clip = Projection · Modelview · obj{x,y,z,w}
clip = clip / clip.w;
win{x,y} = viewport{x,y} + viewport{width,height} * (clip{x,y} + 1)/2
получить матрицу ModelView непосредственно перед вызовом glVertex3d(365,50,0);
glGetFloatv(GL_MODELVIEW_MATRIX, ptr)
где ptr — указатель на массив с плавающей точкой. Поэтому после того, как вы получите эту матрицу, умножьте ее на положение вершины, и вы получите повернутое положение. Используйте библиотеку GLM для удобной работы матрицы.
Я рекомендую сначала нарисовать ваши объекты с их центроидом в начале координат. (0, 0, 0)
,
Затем, когда вы вызываете функцию:
GLfloat matrixMV[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrixMV);
координаты (x, y, z)
будет соответственно (matrixMV[12], matrixMV[13], matrixMV[14])
,