C++ 實現太陽系行星系統

項目簡介:使用 C++實現 OpenGL GLUT 實現一個簡單的太陽系行星系統,將涉及一些三維圖形技術的數學基礎、OpenGL 裏的三維座標系、OpenGL 裏的光照模型、GLUT 的鍵盤事件處理。c++

本教程由歐龍崎發佈在實驗樓,完整教程及在線練習地址:C++ 實現太陽系行星系統,能夠直接在教程中下載代碼使用demo。編程

基本框架設計

1、說明

實驗介紹

本次實驗將使用 OpenGL GLUT 編寫一個簡單的太陽系運行系統。bash

實驗涉及的知識點

  • C++ 語言基礎框架

  • 基本的 Makefile函數

  • 基本的 OOP 編程思想工具

  • OpenGL GLUT 的結構基本使用oop

實驗效果圖

運行效果如圖所示:性能

此處輸入圖片的描述

2、基礎知識

認識 OpenGL 和 GLUT

OpenGL 包含了不少渲染函數,可是他們的設計目的是獨立於任何窗口系統或操做系統的。所以,它自身並無包含建立打開窗口或者從鍵盤或鼠標讀取時間的函數,甚至連最基本的顯示窗口的功能都沒有,因此單純只使用 OpenGL 是徹底不可能建立一個完整的圖形程序的。而且絕大多數程序都須要與用戶進行交互(響應鍵盤鼠標等操做)。GLUT 則提供了這一便利。spa

GLUT 實際上是 OpenGL Utility Toolkit 的縮寫,它是一個處理 OpenGL 程序的工具庫,主要負責處理與底層操做系統的調用及 I/O操做。使用 GLUT 能夠屏蔽掉底層操做系統 GUI 實現上的一些細節,僅使用 GLUT 的 API 便可跨平臺的建立應用程序窗口、處理鼠標鍵盤事件等等。操作系統

咱們先在實驗樓環境中安裝 GLUT:

sudo apt-get update && sudo apt-get install freeglut3 freeglut3-dev

一個標準的 GLUT 程序結構以下代碼所示:

// 使用 GLUT 的基本頭文件
#include <GL/glut.h>

// 建立圖形窗口的基本宏
#define WINDOW_X_POS 50
#define WINDOW_Y_POS 50
#define WIDTH 700
#define HEIGHT 700

// 用於註冊 GLUT 的回調
void onDisplay(void);
void onUpdate(void);
void onKeyboard(unsigned char key, int x, int y);

int main(int argc, char*  argv[]) {

    // 對 GLUT 進行初始化,並處理全部的命令行參數
    glutInit(&argc, argv);
    // 這個函數指定了使用 RGBA 模式韓式顏色索引模式。另外還能夠
    // 指定是使用單緩衝仍是雙緩衝窗口。這裏咱們使用 RGBA 和 雙緩衝窗口
    glutInitDisplayMode(GLUT_RGBA |  GLUT_DOUBLE);
    // 設置窗口被建立時左上角位於屏幕上的位置
    glutInitWindowPosition(WINDOW_X_POS, WINDOW_Y_POS);
    // 設置窗口被建立時的寬高, 爲了簡便起見
    glutInitWindowSize(WIDTH, HEIGHT);
    // 建立一個窗口,輸入的字符串爲窗口的標題
    glutCreateWindow("SolarSystem at Shiyanlou");

    // glutDisplayFunc 的函數原型爲 glutDisplayFunc(void (*func)(void))
    // 這是一個回調函數,每當 GLUT 肯定一個窗口的內容須要更新顯示的時候,
    // glutDisplayFunc 註冊的回調函數就會被執行.
    //
    // glutIdleFunc(void (*func)(void)) 將指定一個函數,用於處理當事件循環
    // 處於空閒的時候,就執行這個函數。這個回調函數接受一個函數指針做爲它的惟一參數
    //
    // glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))
    // 會將鍵盤上的鍵與一個函數關聯,當這個鍵被按下或者釋放時,函數就會調用
    //
    // 所以下面的三行其實是在向 GLUT 註冊關鍵的三個回調函數
    glutDisplayFunc(onDisplay);
    glutIdleFunc(onUpdate);
    glutKeyboardFunc(onKeyboard);

    glutMainLoop();
    return 0;

}

main.cpp 的代碼

提示

單緩衝,是將全部的繪圖指令在窗口上執行,就是直接在窗口上繪圖,這樣的繪圖效率是比較慢的,若是使用單緩衝,而電腦處理性能不夠,屏幕會出現閃爍狀。

雙緩衝,會將繪圖指令是在一個緩衝區完成,這裏的繪圖很是的快,在繪圖指令完成以後,再經過交換指令把完成的圖形當即顯示在屏幕上,進而避免出現繪圖的不完整,效率很高。

雙緩衝則主要分爲前臺緩衝和後臺緩衝,前臺緩衝即咱們說看到的屏幕,後臺緩衝則維護內存中,對用戶不可見。使用雙緩衝時全部繪圖操做都會在後臺進行,當完成繪製後,纔會將結果複製到屏幕上。

這麼作的好處是,若是咱們讓繪製操做實時與顯卡進行操做,當繪製任務複雜時,IO 操做一樣會變得複雜,形成性能較低;而雙緩衝只會在交換緩衝區時將繪製完成後的結果直接發送給顯卡進行渲染,IO 顯著下降。

在 OpenGL 中,推薦使用 GLfloat 來表示浮點數。

3、 詳細教程

本項目的詳細教程和代碼詳解,可在實驗樓中查看並在線完成。

更多C++項目:C/C++所有 - 課程

相關文章
相關標籤/搜索