2015-01-19 3 views
0

Мне было предложено спроектировать и анимировать солнечную систему в openGL. Я делаю это в C. Я немного смущен относительно того, как я должен заниматься анимацией орбит. Как я должен увеличивать угол поворота для каждой планеты, чтобы контролировать скорость ее орбиты вокруг Солнца?Мне нужна помощь в создании солнечной системы в openGL

Вот весь код, я написал до сих пор, просто пытаясь взять его шаг за шагом:

#include <GL/glut.h> 
#include <GL/glu.h> 

#define FACTOR 30.0 
#define SLICES 25 
#define STACKS 25 

//Viewing angle variables 
int eye_x = 2.0; 
int eye_y = 3.0; 
int eye_z = 10.0; 
int up_x = 0.0; 
int up_y = 1.0; 
int up_z = 0.0; 

//Planet diameters in relation to earth 
double sun_radius = 100.0; 
double earth_radius = 1.0; 
double moon_radius = 0.2724; 
double mercury_radius = 0.383; 
double venus_radius = 0.949; 
double mars_radius = 0.532; 
double jupiter_radius = 11.21; 
double saturn_radius = 9.45; 
double uranus_radius = 4.01; 
double neptune_radius = 3.88; 
double pluto_radius = 0.187; 

//Planet distances from sun in relation to earth's distance 
double mercury_distance = (sun_radius/FACTOR) + 0.387; 
double venus_distance = mercury_distance + 0.723; 
double earth_distance = venus_distance + 1.0; 
double mars_distance = earth_distance + 1.52; 
double jupiter_distance = mars_distance + 5.20; 
double saturn_distance = jupiter_distance + 9.58; 
double uranus_distance = saturn_distance + 19.20; 
double neptune_distance = uranus_distance + 30.05; 
double pluto_distance = neptune_distance + 39.24; 

/** 
* Init function initializing the background to black. 
*/ 
void init() 
{ 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 
    glOrtho(-100.0, 100.0, -100.0, 100.0, -100.0, 100.0); 
    glMatrixMode(GL_MODELVIEW | GL_PROJECTION); 
    glEnable(GL_DEPTH_TEST); 

    gluLookAt(eye_x, eye_y, eye_z, 0.0, 0.0, 0.0, up_x, up_y, up_z); 
} 

/* 
void stars() 
{ 
    int noOfStars = rand() % 10; 
    int i = 0; 

    while(i < noOfStars) 
    { 
     glColor3f(1.0, 1.0, 1.0); 
     glPointSize(20.0f); 

     int x = rand() % 10; 
     int y = rand() % 10; 
     int z = -8.0; 

     glBegin(GL_POINTS); 
      glVertex3f(x, y, z); 
     glEnd(); 

     i++; 
    } 

    glFlush(); 
    glutSwapBuffers(); 
} 
*/ 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    //stars(); 

    //"Zoom out" 
    glTranslatef(0.0, 0.0, -20.0); 

    //Draw sun 
    glColor4f(1.0, 0.5, 0.0, 0.3); 
    glutWireSphere(sun_radius/FACTOR, SLICES, STACKS);  

    //Draw mercury 
    //Rotate around sun 
    //glRotatef(, 0.0, 1.0, 0.0); 
    //Distance from sun to mercury 
    glTranslatef(mercury_distance, 0.0, 0.0); 
    glPushMatrix(); 
     //glRotatef(, 0.0, 1.0, 0.0); 
     glColor4f(1.0, 0.75, 0.75, 0.3); 
     glutWireSphere(mercury_radius, SLICES, STACKS); 
    glPopMatrix(); 

    /* 
    //Draw venus 
    //Distance from sun to venus 
    glTranslatef(venus_distance, 0.0, 0.0); 
    glPushMatrix(); 
     glColor4f(1.0, 0.75, 0.75, 0.3); 
     glutWireSphere(venus_radius, SLICES, STACKS); 
    glPopMatrix(); 

    //Draw earth 
    //Distance from sun to earth 
    glTranslatef(earth_distance, 0.0, 0.0); 
    glPushMatrix(); 
     glColor4f(1.0, 0.75, 0.75, 0.3); 
     glutWireSphere(earth_radius, SLICES, STACKS); 
    glPopMatrix(); 
    */ 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

int main(int argc, char* argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 
    glutInitWindowPosition(0,0); 
    glutInitWindowSize(1000, 1000); 
    glutCreateWindow("solar system"); 

    init(); 
    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 

    glutMainLoop(); 

    return 0; 
} 
+0

смотрите здесь http://stackoverflow.com/a/28020934/2521214 и здесь http://stackoverflow.com/a/25403425/2521214 – Spektre

ответ

0

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

Соответственно, угол позиции планеты не изменится с постоянной скоростью, если вы хотите сделать это точно. Разумеется, вы можете упростить и сказать, что планетарные орбиты достаточно близки к кругам, чтобы это не имело значения (и сказать, что Плутон больше не планета, так что это даже не имеет значения).

Но давайте вернемся к точному решению: Это определяется законом Ньютона:

F = g * M_1 * M_2/r^2 // How do you put equations here? 

и энергосбережение, торгуете кинетическая энергия E = M v^2/2 для потенциальной энергии Е = - г * M_1 * M_2/r

Итак, чтобы смоделировать движение планеты вокруг Солнца, получить его положение, его скорость и действующую на него гравитационную силу, вычислить, где вы закончите один шаг позже, вычислить новую скорость и силу, действующую на него, и повторить. (Делайте то же самое для всех планет и игнорируйте гравитационные взаимодействия между ними на данный момент.)

Это будет реальная симуляция солнечной системы. Если вы хотите только имитировать позиции в любой момент времени, найдите Keplers laws - по сути, это следствие применения закона Ньютонов.


Я только что видел, что статья выше даже есть раздел «Положение в зависимости от времени» - так что должно помочь вам с алгоритмом.

+0

Большое спасибо Alex! Ваш ответ был очень полезным. Я думаю, что сначала я попытаюсь сделать более простое решение, предполагая, что орбиты - это круги, а затем попробуйте для эллипса. Я не совсем уверен, как эффективно реализовать эти уравнения в openGL, так как я очень новичок в этой библиотеке, но я обязательно сделаю это! Еще раз спасибо Алекс! – user3579421

+0

Использование кругов, конечно, упрощает уравнения. Если вы рассматриваете только 8 основных планет, вы даже можете вернуться к 2D-орбитам, так как все крупные планеты перемещаются примерно в одну и ту же плоскость. [Статья в Википедии Солнечной системы] (http://en.wikipedia.org/wiki/Solar_System) говорит: «Самые крупные объекты на орбите вокруг Солнца лежат вблизи плоскости земной орбиты, известной как эклиптика». Таким образом, у вас есть только один чтобы беспокоиться, и что каждый изменяется с постоянной скоростью для каждой планеты. – Alex

+0

@alex Наклон основных тел несколько градусов, но на этом огромном расстоянии он становится видимым на ночном небе .... посмотрите на изображения на моем первом звене в комментарии моего комментария Мои линии - это основные траектории тел, видимые с поверхности Земли , на виду со стороны Земли это не так очевидно – Spektre

Смежные вопросы