Перемещение сферы вокруг эллипса - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь написать простую программу, которая перемещает Сферу вокруг Эллипса в 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();
   }

Проблема, с которой я столкнулся, заключается в том, что эллипс втянут и сфера тоже, но он просто остается в одной точке эллипса. Так что я делаю не так?

1 Ответ

0 голосов
/ 29 апреля 2018

Да, вам нужно правильно использовать функции. Анимация происходит в 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();
}
...