1

私の紹介者であるOpenGLのものを使った非常にシンプルなプログラムがあります。画面に3D頂点があり、システム全体がy軸に沿って回転しています。

float rotation =0;
//update function
rotation = rotation +1;

描画関数は次のようになります。

glPushMatrix();
        glTranslatef(500,390,0);
        glRotatef(rotation,0.0,1.0,0.0);
        glVertex3d(365,50,0);
glPopMatrix();

glVertexが回転しているとき、画面上のその位置は明らかに変化しています。しかし、ポイント自体の座標はそうではありません。「実際の」座標が静止しcurrentているときに、によって回転された画面上の点の座標を取得するにはどうすればよいですか?glRotatef

4

3 に答える 3

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);

この時点で、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
于 2013-01-20T11:57:35.767 に答える
0

呼び出す直前にModelViewMatrixを取得するglVertex3d(365,50,0);

glGetFloatv(GL_MODELVIEW_MATRIX, ptr)

ここで、ptrはfloat配列へのポインターです。したがって、その行列を取得した後、それを頂点位置で乗算すると、回転した位置が得られます。行列の操作を簡単にするためにGLMライブラリを使用します。

于 2013-01-20T11:44:17.413 に答える
0

最初に、重心を原点にしてオブジェクトを描画することをお勧めします(0, 0, 0)

次に、関数を呼び出すと、次のようになります。

GLfloat matrixMV[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrixMV);

座標(x, y, z)はそれぞれ(matrixMV[12], matrixMV[13], matrixMV[14])

于 2016-07-01T04:53:43.567 に答える