Моделирование солнечной системы в openGL

Я пытаюсь смоделировать солнечную систему в c ++ и openGL, и мне было интересно, есть ли дешевый метод, который я мог бы создать, который бы возвращал вектор x, y, z, который я мог бы использовать для обновления положения каждой планеты каждый раз? Рамка.

-2

Решение

Что касается планетарных позиций, у вас есть несколько альтернатив.

  • Неточно (но «в шаре»): предположим, что планеты движутся по кругу, на плоскости
  • Несколько неточно (но гораздо ближе к реальности): скачать «орбитальные элементы«для планет из группы динамики солнечной системы в JPL; распространять орбиты, используя Уравнение Кеплера (намного проще, чем кажется). Это будет в основном правильно (особенно для больших планет).
  • Точно: скачать JPL Эфемериды для планетарных позиций (DE405 или DE421) и используйте один из доступных считывателей (например, SPICE) для получения состояния с максимально возможной точностью (обратите внимание, что это не обязательно «вычислительно дорого»)
  • Точно: скачать VSOP данные и связанные с ними программы (не такие точные, как эфемериды JPL, но также и «предварительная оценка проекта»).

Я нашел код, который написал некоторое время назад, чтобы продемонстрировать «быстрый и грязный» способ визуализации DE421 данные с использованием SPICE и OpenGL. Может быть, это может помочь вам.

Простой скриншот

#include<cstdlib>
#include<cmath>
#include<OpenGL/gl.h>
#include<OpenGL/glu.h>
#include<GLUT/glut.h>
#include<SpiceUsr.h>

// hard-code some parameters - in a real application all this would be dynamic
#define ALTITUDE 700E6      // in kilometers
#define CLIPPING 100E7
#define FOV 45.0        // 45-degree field-of-view
#define WIN_WIDTH 1024
#define WIN_HEIGHT 1024

// callback to render the trajectory of a planet using spice (notice
// that I use 366 points - one per day starting at epoch 0.0
// (01-Jan-2000 12:00:00 ET) - (r, g, b) is the color
void render_planet(const char* planet, int r, int g, int b) {
unsigned int N = 366;
double et = 0.0;
double state[3];
double lt;

// we just want a simple line
glBegin(GL_LINE_STRIP);
glColor4d(r, g, b, 1.0);

for(unsigned int k=0; k<N; k++) {
// call spice to calculate position
spkpos_c(planet, et, "ECLIPJ2000", "None", "Sun", state, &lt);
// add the point to the pipeline
glVertex3d(state[0], state[1], state[2]);
// increase time by one day
et = 86400 * k;
}
glEnd();
}

// callback to handle window resizing
void changeSize(int w, int h) {
if (h == 0) h = 1;
float ratio =  w * 1.0 / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluPerspective(FOV, ratio, 0.2f, CLIPPING);
glMatrixMode(GL_MODELVIEW);
}

// callback to render scene
void renderScene() {
// use a nice dark gray for the background (as opposed to pitch black)
glClearColor(50/255.0, 50/255.0, 50/255.0, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(0.0, 0.0,  ALTITUDE,
0.0, 0.0,  0.0,
0.0, 1.0,  0.0);
// here we tell the application which planets to draw, the colors
// are (r, g, b), so (1, 1, 0) is all red and all green (yellow),
// and so forth - of course this can be simplified to use arbitrary
// colors
render_planet("Mercury", 1, 1, 0);
render_planet("Venus", 0, 1, 0);
render_planet("Earth", 0, 0, 1);
render_planet("Mars", 1, 0, 0);
glutSwapBuffers();
}

int main(int argc, char* argv[]) {
// initialize spice kernels
furnsh_c("/data/spice/allkernels.txt");
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(0, 0);
glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT);
glutCreateWindow("Simple Trajectory Viewer");
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutMainLoop();
return EXIT_SUCCESS;
}
6

Другие решения

Если вы хотите разработать полноценную солнечную или другую систему в OpenGL, я бы порекомендовал взглянуть на этот Книга. Она учит вас такой разработке приложений. В противном случае ваш вопрос имеет слишком много возможных решений. Вы должны мне более конкретным.

2

По вопросам рекламы [email protected]