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

此时模型视图矩阵保存了应用的模型视图变换,所以也得到这个。

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

在调用之前获取 ModelView 矩阵glVertex3d(365,50,0);

glGetFloatv(GL_MODELVIEW_MATRIX, ptr)

其中 ptr 是指向浮点数组的指针。因此,在您获得该矩阵后,将其与顶点位置相乘,您将获得旋转位置。使用 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 回答