当它们的“实际”坐标静止时,如何获取屏幕上已由 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