我发现了我的错误,这是一个愚蠢的错误。一切正常。那么我该如何删除这个问题?
我似乎无法用OpenGL让地球绕太阳旋转,我不知道为什么会这样。
这是(我相信的)相关源代码的简化版本(用c ++编写)。
这是在调用任何其他OpenGL函数之前调用一次的Init()
函数:
void Init() {
glMatrixMode(GL_MODELVIEW);
gluLookAt (
0, 1, -3, // Where am I
0, 0, 0, // Where am I looking at
0, 1, 0 // Direction of 'my head'
);
// Going to Projection mode ...
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// ... to set up perspective viewing.
glFrustum (-0.5, 0.5,
-0.5, 0.5,
1.0, 100.0);
// Going back to Model view since drawing
// is done entierly in Modelview.
glMatrixMode(GL_MODELVIEW);
}
然后这是为了“动画”场景而被重复调用的Draw()
函数:
void Draw() {
glClear(
GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT
);
// Draw yellow Sun
glColor3d(1.0, 1.0, 0.0);
sphere(radius_sun);
// draw the path of the Earth around
// the Sun. Assume distance Earth to Sun = 1
glColor4d( 0.0, 0.0, 1.0, 0.5);
glBegin(GL_LINE_LOOP);
for (double q=0; q<=1; q+=0.01) {
double rad = q * M_PI * 2.0;
glVertex3d(std::cos(rad), 0, std::sin(rad));
}
glEnd();
// the Earth
glColor3d(1.0, 1.0, 1.0);
glPushMatrix();
// Assign a value to t dependant on the
// time already passed.
double t = IncreasingDouble();
double angle = t * M_PI * 2.0;
// Rotate scene angle degres about y-axis:
glRotated (angle, 0, 1, 0);
// And then translate coordinate system
glTranslated(1, 0, 0);
sphere(radius_earth);
// Restore matrix for next call
glPopMatrix();
// Swap Buffers and the more snipped..
}
我没有发现我的错误,但是地球正在螺旋式地远离太阳而进一步移动尽管场景的其余部分(太阳和地球的轨道路径)被正确绘制。
答案 0 :(得分:1)
问题必须在别处,也许在你的sphere()方法中。我跟你做了同样的步骤,但我的工作。这就是我所拥有的,它以你想要的方式工作(一个球体在另一个球体周围平滑旋转)(另外,请注意我的gluLookAt和glFrustum是不同的,但这应该没有区别。我只是这样做,所以我可以使用我的鼠标改变我的观察点):
// draw the scene
void myGlutDisplay( void )
{
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// projection transform
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1, 1, -1, 1, 1, 1000);
// camera transform
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eye[0], eye[1], eye[2], lookat[0], lookat[1], lookat[2], 0, 1, 0);
//
// draw some stuff
//
// Draw yellow Sun
glColor3d(1.0, 1.0, 0.0);
glutSolidSphere(1, 128, 128);
glPushMatrix();
double angle = (t+=.1) * 3.14156 * 2.0;
glRotated(angle, 0, 1, 0);
glTranslated(5, 0, 0);
glutSolidSphere(1,128,128);
glPopMatrix();
glutSwapBuffers();
}