我期待在C++和openGL中模擬太陽系,而且我想知道是否有一種便宜的方法可以生成返回一個x,y,z向量,我可以用於每幀更新每個行星的位置。在openGL中對太陽系進行建模
-2
A
回答
6
關於行星位置,你有幾種選擇。
- 準確(但「在球公園」):假設行星循環往復,在飛機上
- 有些不準確(但更接近於現實):下載「orbital elements」從行星JPL的太陽系動力學小組;使用Kepler's equation傳播軌道(比聽起來簡單得多)。這將是最正確的(特別是對於大行星)。
- 準確:下載JPL Ephemerides的行星的位置(DE405或DE421),並使用可用閱讀器(例如,SPICE),以獲取儘可能多的準確狀態,因爲它是目前可能(注意這不一定是「計算的一個昂貴的「)
- 準確:下載VSOP數據和相關程序(不如JPL的星曆錶精確,但也是」任務初步設計等級「)。
我發現了前段時間寫的一些代碼,用於演示使用SPICE和OpenGL可視化DE421數據的「快速和骯髒」方式。也許它可以幫助你。
#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, <);
// 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;
}
2
如果你想在OpenGL中開發一個全尺寸的太陽能或其他系統,我建議看一下this這本書。它教你如何開發這種應用程序。否則你的問題有太多可能的解決方案。你應該我更具體。
相關問題
- 1. 太陽系模擬器
- 2. 在opengl中創建一個太陽系 - 照明不能按計劃工作
- 3. ThreeJS創建太陽
- 4. 我的太陽系問題
- 5. 浮動/雙比較在太陽系模擬中不起作用
- 6. 太陽系軌道html中心
- 7. 如何在太陽黑子中進行基於「或」的搜索?
- 8. 可以對我一些指向我的一些源代碼示例(android opengl,opengl)關於太陽系
- 9. 如何在關係數據庫中對此進行建模?
- 10. Unity3D太陽能系統屬性
- 11. 可以在數組內進行太陽黑子搜索嗎?
- 12. 太陽黑子
- 13. 太陽能系統模型Python - 列表操作難度
- 14. 如何以及如何在Opengl中創建3D火(更精確地模擬太陽)?
- 15. 我建立太陽能系統,採用three.js所
- 16. 試圖創建一個隨機「太陽系」
- 17. OpenGL:動畫時,所有行星在太陽周圍都有相同的速度
- 18. Solr和太陽黑子模糊搜索
- 19. 如何點擊模糊的太陽?
- 20. 太陽黑子創建索引?
- 21. 在定義了UML用例之後對系統進行建模
- 22. 太陽黑子/ solr
- 23. 與太陽黑子
- 24. Boost_fields太陽黑子
- 25. 爲太陽神Eclipse3.6.2
- 26. Vimeo浮動太陽?
- 27. 模型中的軌道條件,以便使用太陽黑子solr對結果進行排序
- 28. 太陽黑子:按屬性對屬性進行排序/排序。 created_at
- 29. 如何通過與太陽黑子協會進行搜索?
- 30. 使用Solr太陽黑子進行搜索
您可以創建一個類行星與X,Y和Z點(浮點)等,然後,根據每個行星的當前位置和其他相關資料更新其位置,在步驟時間delta_t。 – 2013-04-25 18:59:16
爲什麼它需要便宜?當然,對於大約十幾個物體,任何計算它們相對位置的舊方法都應該能夠達到合理的性能。更棘手的部分將紋理,否則使行星看起來不錯。 – 2013-04-25 18:59:21
那麼這就是我不確定三維運動的正確方程是什麼。 – Yann 2013-04-25 19:09:19