我正在尝试编写一个简单的程序,以在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();
}

关于c++ - 在椭圆上移动球体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50081340/

10-11 23:22
查看更多