我有一个非常简单的程序与我的介绍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
坐标?
答案 0 :(得分:5)
当“实际”坐标静止时,如何获得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 );
你去吧。我建议查看MesaGL提供的gluProject源代码。但基本上就是这些步骤:
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
答案 1 :(得分:0)
在调用glVertex3d(365,50,0);
glGetFloatv(GL_MODELVIEW_MATRIX, ptr)
其中ptr是指向float数组的指针。因此,在您获得该矩阵后,将其与顶点位置相乘,您将获得旋转位置。使用GLM库可以轻松进行矩阵操作。
答案 2 :(得分:0)
我建议您首先使用原点(0, 0, 0)
中的质心绘制对象。
然后,当您调用该函数时:
GLfloat matrixMV[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrixMV);
坐标(x, y, z)
将分别为(matrixMV[12], matrixMV[13], matrixMV[14])
。