围绕椭圆移动球体

Moving a Sphere Around a Ellipse

我正在尝试编写一个简单的程序,在 OpenGL 中围绕椭圆移动球体。我认为如果我将平移坐标设置为与椭圆坐标相同,它将模拟运动。

这是我已有的代码:

#include "stdafx.h"
#include <windows.h>
#include <GL/Gl.h>
#include <GL/GLU.h>
#include <GL/glut.h>
#include <math.h>

const float eRad = 6.5;

void drawSphere(void)
{
  float x = 0.5;
  float y = 0.4;
  float z = 0.0;
  glMatrixMode(GL_PROJECTION | GL_MODELVIEW);
  glLoadIdentity();
  glClear(GL_COLOR_BUFFER_BIT);                 


// Draw the Ellipse
glColor3d(1.0, 0.0, 1.0);
glBegin(GL_LINE_STRIP);
for (float i = 0; i <= eRad; i += 0.1)
{
    glVertex2f(x*cos(i), y*sin(i));
}
glEnd();

//Draw the Sphere
glColor3d(1.0, 1.0, 0.0);
glPushMatrix();
glTranslatef(0.5, 0, 0);
glutWireSphere(0.15, 30, 30);
glPopMatrix();
glFlush();
}

 void animation(void)
 {
   float x = 0.2;
   float y = 0.1;
   float z = 0.0;

   for (float i = 0; i <= eRad; i += 0.1)
   {
      glTranslated(x*cos(i), y*sin(i), z);
    }
   drawSphere();
 }

 int main(int argc, char** argv)
 {
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize(600, 600);
   glutInitWindowPosition(0, 0);
   glutCreateWindow("Moving Sphere Test");
   glutDisplayFunc(drawSphere);
   glutIdleFunc(animation);
   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
   glViewport(0, 0, 600, 600);
   glutMainLoop();
   }

我遇到的问题是椭圆和球体都被绘制了进去,但它只是停留在椭圆上的一个点上。那我做错了什么?

是的,您需要正确使用这些功能。动画发生在 glutDisplayFunc 中,状态设置可以发生在 glutIdleFunc 中(不是必须的)。 gultTimerFunc() 回调是您想要在每一帧调用的回调。我对你的代码做了一些修改。但您可能希望正确使用 GLUT。

const float eRad = 6.5;
static float iter = 0.0;

void drawSphere(void)
{
  float x = 0.5;
  float y = 0.4;
  float z = 0.0;
  glMatrixMode(GL_PROJECTION | GL_MODELVIEW);
  glLoadIdentity();
  glClear(GL_COLOR_BUFFER_BIT);

// Draw the Ellipse
glColor3d(1.0, 0.0, 1.0);
glBegin(GL_LINE_STRIP);
for (float i = 0; i <= eRad; i += 0.1)
{
    glVertex2f(x*cos(i), y*sin(i));
}
glEnd();

//Draw the Sphere
glColor3d(1.0, 1.0, 0.0);
glPushMatrix();
glTranslatef(x*cos(iter), y*sin(iter), 0);
glutWireSphere(0.15, 30, 30);
glPopMatrix();
glFlush();
}

 void animation(void)
{
        iter = (iter < 6.5) ? iter+0.0001 : 0.0;
}
void Timer(int value) {
        glutTimerFunc(33, Timer, 0);
        glutPostRedisplay();
}
 int main(int argc, char** argv)
 {
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize(600, 600);
   glutInitWindowPosition(0, 0);
   glutCreateWindow("Moving Sphere Test");
   glutDisplayFunc(drawSphere);
   glutIdleFunc(animation);
   glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
   glViewport(0, 0, 600, 600);
   Timer(0);

   glutMainLoop();
}