「実際の」座標が静止しているときに、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);
この時点で、modelviewマトリックスは適用されたmodelview変換を保持しているので、これも取得します。
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