用OpenGL實現粒子的隨機運動
阿新 • • 發佈:2017-08-15
ids i++ isp 實現 include switch ota matrix demo
一、目的:
掌握OpenGL中粒子的繪制、隨機數的使用
二、代碼:
#include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> //srand和rand #include <time.h> //time(int) const int N = 2000; float particles[N][3]; float rtri = 0; // 初始化材質屬性、光源、光照模型、深度緩沖區 void init(void) { //材質反光性設置 GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; //鏡面反射參數 GLfloat mat_shininess[] = { 50.0 }; //高光指數 GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 }; //燈位置(1,1,1), 最後1-開關 GLfloat Light_Model_Ambient[] = { 1.0, 0.2, 0.5, 0.1 }; //環境光參數 glClearColor(0.0, 0.0, 0.0, 0.0); //背景色 glShadeModel(GL_SMOOTH); //多變性填充模式 //材質屬性 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); //燈光設置 glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); //散射光屬性 glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); //鏡面反射光 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient); //環境光參數 glEnable(GL_LIGHTING); //開關:使用光 glEnable(GL_LIGHT0); //打開0#燈 glEnable(GL_DEPTH_TEST); //打開深度測試 } void display(void) { //通過循環更新每個粒子的位置 for (int i = 0; i < N; i++) { for (int j = 0; j < 3; j++) { particles[i][j] += (rand() % 800 / 800.0 - 0.5) / 100; } } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除顏色緩存和深度緩存 glLoadIdentity(); //裝入單位轉換矩陣 //平移 glTranslatef(0.0f, 0.0f, -4.0f);//總體旋轉 glRotatef(rtri, 0.1, 1.0, 0.1); //每個粒子的位置變動 for (int i = 0; i < N; i++) { glPushMatrix(); //平移到第i個粒子位置 glTranslatef(particles[i][0], particles[i][1], particles[i][2]); glutSolidSphere(0.02, 20, 16); glPopMatrix(); } rtri += 0.5f;//加一個角度 glutSwapBuffers();//交換雙緩存 } void reshape(int width, int height) { glViewport(0, 0, width, height); //投影模式 glMatrixMode(GL_PROJECTION); glLoadIdentity(); //設置斜投影矩陣參數 gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 600.0f); //模型-視圖矩陣模式 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case ‘x‘: case ‘X‘: case 27: //ESC鍵 exit(0); break; default: break; } } int main(int argc, char** argv) { //seed初始化隨機數函數 srand((unsigned int)time(0)); //random seeds for (int i = 0; i < N; i++) { for (int j = 0; j < 3; j++) { particles[i][j] = (rand() % 800 / 800.0 - 0.5) * 2; } } glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使用雙緩存模式和深度緩存 glutInitWindowSize(800, 800); glutInitWindowPosition(0, 0); glutCreateWindow("粒子群"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutIdleFunc(display);//設置空閑時調用的函數 glutMainLoop(); return 0; }
用OpenGL實現粒子的隨機運動