Как повернуть объект по круговой траектории в OpenGL? - PullRequest
0 голосов
/ 17 апреля 2020

я работаю над программой, в которой я хочу вращать объект по круговому пути.

посмотрите на мой код для реализации функциональности

#include<stdio.h>
#include<math.h>
#include<GL/glut.h>
#define pi 3.142
static GLfloat angle=0;
void init()

{
    gluOrtho2D(-780, 780, -780, 780); 
}
void circle(float rad)
{
    glBegin(GL_POINTS); 
    glColor3f(1,0,0);
    for ( float i = 0; i < (2 * pi); i += 0.00001) 
    { 
        glVertex2i(rad * cos(i), rad * sin(i)); 
    } 
    glEnd();
}
void ele(float rad)
{
    glBegin(GL_POINTS);
    glColor3f(1,1,1);
    for ( float i = 0; i < (2 * pi); i += 0.00001) 
    { 
        glVertex2i(rad+10* cos(i),10* sin(i)); 
        glVertex2i(-(rad +10* cos(i)),10* sin(i)); 
    } 
    glEnd();
}
void nuc(float rad)
{
    glBegin(GL_POLYGON);
    glColor3f(1,1,0);
    for (float i=0;i<(2 * pi);i=i+0.00001)
    {
        glVertex2f(rad*cos(i),rad*sin(i));
    }
    glEnd();
}
void display()
{
    glPushMatrix();
    glRotatef(angle,0,0,1);
    nuc(200);

    ele(400);
    circle(400);

    ele(600);
    circle(600);
    glPopMatrix();
    glutSwapBuffers();
}
void rotate(){
    angle=angle+0.2;
    if(angle>360)
    {
        angle=angle-360;
    }
    glutPostRedisplay();
}
void mouseControl(int button, int state, int x, int y)
{
    switch (button)
    {
    case GLUT_LEFT_BUTTON:
        if ( state == GLUT_DOWN)
            glutIdleFunc(rotate);
        break;
    case GLUT_MIDDLE_BUTTON:
    case GLUT_RIGHT_BUTTON:
        if(state==GLUT_DOWN)
            glutIdleFunc(NULL);
        break;
    default:
        break;
    }
}
void keyboard(unsigned char key, int x, int y)
{
    if (key== 32){
        glutIdleFunc(rotate);
    }
    if(key==17){
        glutIdleFunc(NULL);
    }
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(500, 500);
    glutCreateWindow("ATOM SIMULATION");
    init();
    glutDisplayFunc(display);
    glutMouseFunc(mouseControl);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}

каким-то образом я реализовал это так, но вращающийся объект будет находиться как в предыдущем, так и в текущем положении. Кто-нибудь может мне сказать, что я хочу, чтобы только два объекта вращались по орбите, но это происходит в моей реализации, пожалуйста, помогите мне посмотрите на вывод здесь

...