Opengl 如何得到一个绕轨道运行的球体的位置

Opengl 如何得到一个绕轨道运行的球体的位置,opengl,Opengl,我试图在我的opengl应用程序中获得一个球体的位置,该球体围绕一个空闲对象旋转。这就是我执行轨道运行的方式: glTranslatef(positions[i].getPosX(), //center of rotation (yellow ball) positions[i].getPosY(), positions[i].getPosZ());

我试图在我的opengl应用程序中获得一个球体的位置,该球体围绕一个空闲对象旋转。这就是我执行轨道运行的方式:

            glTranslatef(positions[i].getPosX(), //center of rotation (yellow ball)
                           positions[i].getPosY(),
                           positions[i].getPosZ());
            glRotatef(rotation_angle,0.0,1.0,0.0); //angle of rotation
            glTranslatef(distance[i].getPosX(), //distance from the center of rotation
                           distance[i].getPosY(),
                           distance[i].getPosZ());

可变旋转角度从0到360无限循环。在距离向量中,我只改变了对象的z距离,例如,假设空闲对象位于(0,0,0),距离向量可以是(0,0200)

OpenGL只是画东西。它不维护“场景”。所以你必须自己做所有的数学题。这与将向量(0,0,0,1)与当前modelview投影矩阵相乘并执行视口重新映射一样简单。这已经方便地打包在GLU(而不是OpenGL)函数中

由于您使用的是(旧的和损坏的)固定函数管道,因此过程如下

GLdouble x,y,z;
GLdouble win_x, win_y, win_z;
GLdouble mv[16], prj[16];
GLint vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX, mv);
glGetDoublev(GL_PROJECTION_MATRIX, prj);
glGetInteger(GL_VIEWPORT, vp);
gluProjection(x,y,z, mv, prj, vp, win_x, win_y, win_z);

请注意,由于OpenGL的状态特性,在绘制球体时,modelview和投影矩阵以及视口的值很重要。在任何其他时刻检索这些值可能会产生非常不同的数据,并导致结果与图纸不一致。

Mh,这似乎可行,但我得到的结果却很奇怪。我本来希望在win_x,win_y,win_z中看到绕轨道运行的球体的实际位置,但事实并非如此。在轨道中间的空闲对象以x=0,y=0为中心,但WiNyx和WiSyy从来没有(0,0)。@安得烈:关于什么的球的位置?我给你的解决方案给出了窗口坐标中的位置……这是OpenGL所关心的。如前所述,OpenGL不维护场景,因此在窗口位置和顶点的局部坐标之间,您可以进入的唯一空间是视图空间(在modelview变换之后)和剪辑空间(在投影变换之后)。这些变换归结为简单的向量矩阵乘法(将顶点位置与modelview矩阵相乘以进入视图空间)。