我试图在我的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());
变量 rotation_angle 无休止地从0到360循环。在距离矢量中,我只改变物体的z距离,例如,假设空闲物体在(0,0,0)中,距离矢量可以是(0,0,200) 。
答案 0 :(得分:2)
OpenGL只是吸引人的东西。它没有维持“场景”。所以你必须自己做所有的数学运算。这就像将矢量(0,0,0,1)与当前模型视图 - 投影矩阵相乘并执行视口重新映射一样简单。这已经方便地打包在GLU(非OpenGL)函数gluProject
中。
由于您正在使用(旧的和已破坏的)固定功能管道,因此程序遵循
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的有状态特性,在绘制球体时,模型视图和投影矩阵以及视口的值很重要。在任何其他时刻检索这些值可能会产生非常不同的数据,并导致结果与图形不一致。