1. 程式人生 > >【OpenGL】OpenGL顏色立方體

【OpenGL】OpenGL顏色立方體

使用OpenGL繪製RGB顏色立方體

  • 方向鍵旋轉
  • 滑鼠點選/拖拽

C++程式碼

#include <iostream>
#include <GL/glut.h>
using namespace std;

#define M_PI 3.1415926535898

GLfloat AngleX;
GLfloat AngleY;

static float c = M_PI / 180.0f;             //弧度和角度轉換引數
static int du = 90, oldmy = -1, oldmx = -1; //du是視點繞y軸的角度,opengl裡預設y軸是上方向
static float r = 15.0f, h = 0.0f; //r是視點繞y軸的半徑,h是視點高度即在y軸上的座標 void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); { // 這句話在後面,黑點絕對位置會變化 gluLookAt(r*cos(c*du), h, r*sin(c*du), 0
, 0, 0, 0, 1, 0); //從視點看遠點,y軸方向(0,1,0)是上方向 glRotatef(AngleX, 1.0f, 0.0f, 0.0f); glRotatef(AngleY, 0.0f, 1.0f, 0.0f); // 上表面 glBegin(GL_POLYGON); // 繪製一個凸多邊形,頂點1到n定義了這個多邊形。 glColor3ub((GLubyte)255, (GLubyte)255, (GLubyte)255); //顏色設定為白色 glVertex3f(50.0f, 50.0f, 50.0f); glColor3ub((GLubyte)255
, (GLubyte)255, (GLubyte)0); //顏色設定為黃色 glVertex3f(0.0f, 50.0f, 50.0f); glColor3ub((GLubyte)255, (GLubyte)0, (GLubyte)0); //顏色設定為紅色 glVertex3f(0.0f, 50.0f, 0.0f); glColor3ub((GLubyte)255, (GLubyte)0, (GLubyte)255); //顏色設定為品紅色 glVertex3f(50.0f, 50.0f, 0.0f); glEnd(); // 下表面 glBegin(GL_POLYGON); glColor3f(0.0f, 1.0f, 1.0f); //顏色設定為青色 glVertex3f(50.0f, 0.0f, 50.0f); glColor3f(0.0f, 1.0f, 0.0f); //顏色設定為綠色 glVertex3f(0.0f, 0.0f, 50.0f); glColor3f(0.0f, 0.0f, 0.0f); //顏色設定為黑色 glVertex3f(0.0f, 0.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); //顏色設定為藍色 glVertex3f(50.0f, 0.0f, 0.0f); glEnd(); // 前表面 glBegin(GL_POLYGON); glColor3d(0.0, 1.0, 1.0); //顏色設定為青色 glVertex3f(50.0f, 0.0f, 50.0f); glColor3d(1.0, 1.0, 1.0); //顏色設定為白色 glVertex3f(50.0f, 50.0f, 50.0f); glColor3d(1.0, 0.0, 1.0); //顏色設定為品紅色 glVertex3f(50.0f, 50.0f, 0.0f); glColor3d(0.0, 0.0, 1.0); //顏色設定為藍色 glVertex3f(50.0f, 0.0f, 0.0f); glEnd(); // 後表面 glBegin(GL_POLYGON); glColor3ub(0u, 255u, 0u); //顏色設定為綠色 glVertex3f(0.0f, 0.0f, 50.0f); glColor3ub(255u, 255u, 0u); //顏色設定為黃色 glVertex3f(0.0f, 50.0f, 50.0f); glColor3ub(255u, 0u, 0u); //顏色設定為紅色 glVertex3f(0.0f, 50.0f, 0.0f); glColor3ub(0u, 0u, 0u); //顏色設定為黑色 glVertex3f(0.0f, 0.0f, 0.0f); glEnd(); //左表面 glBegin(GL_POLYGON); glColor3ub((GLubyte)255, (GLubyte)255, (GLubyte)255); //顏色設定為白色 glVertex3f(50.0f, 50.0f, 50.0f); glColor3ub((GLubyte)0, (GLubyte)255, (GLubyte)255); //顏色設定為青色 glVertex3f(50.0f, 0.0f, 50.0f); glColor3ub((GLubyte)0, (GLubyte)255, (GLubyte)0); //顏色設定為綠色 glVertex3f(0.0f, 0.0f, 50.0f); glColor3ub((GLubyte)255, (GLubyte)255, (GLubyte)0); //顏色設定為黃色 glVertex3f(0.0f, 50.0f, 50.0f); glEnd(); //右表面 glBegin(GL_POLYGON); glColor3f(1.0f, 0.0f, 1.0f); //顏色設定為品紅色 glVertex3f(50.0f, 50.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); //顏色設定為藍色 glVertex3f(50.0f, 0.0f, 0.0f); glColor3f(0.0f, 0.0f, 0.0f); //顏色設定為黑色 glVertex3f(0.0f, 0.0f, 0.0f); glColor3f(1.0f, 0.0f, 0.0f); //顏色設定為紅色 glVertex3f(0.0f, 50.0f, 0.0f); glEnd(); } glPopMatrix(); glutSwapBuffers(); } void reshape(int w, int h) { GLfloat aspect = (GLfloat)w / (GLfloat)h; GLfloat nRange = 100.0f; // 如果範圍太小會有突然“消失”的感覺,顯示範圍的問題 glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); //將當前矩陣指定為投影模式 glLoadIdentity(); //設定三維投影區 if (w <= h) { glOrtho(-nRange, nRange, -nRange * aspect, nRange * aspect, -nRange, nRange); } else { glOrtho(-nRange, nRange, -nRange / aspect, nRange / aspect, -nRange, nRange); } } /* ↑ ↓ ← → 調整圖形 */ void key_board(GLint key, GLint x, GLint y) { if (key == GLUT_KEY_UP) { AngleX -= 5.0f; } if (key == GLUT_KEY_DOWN) { AngleX += 5.0f; } if (key == GLUT_KEY_LEFT) { AngleY -= 5.0f; } if (key == GLUT_KEY_RIGHT) { AngleY += 5.0f; } if (AngleX > 355.0f) { AngleX = 0.0f; } if (AngleX < 0.0f) { AngleX = 355.0f; } if (AngleY > 355.0f) AngleY = 0.0f; if (AngleY < 0.0f) { AngleY = 355.0f; } glutPostRedisplay(); } /* 初始化 */ void init() { // 這個角度展示出來類似於HSV模型的地面六邊形 AngleX = 45.0f; AngleY = 315.0f; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 背景黑色 //glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 背景白色 glEnable(GL_DEPTH_TEST); glEnable(GL_DITHER); glShadeModel(GL_SMOOTH); } /* 處理滑鼠點選 */ void Mouse(int button, int state, int x, int y) { if (state == GLUT_DOWN) //第一次滑鼠按下時,記錄滑鼠在視窗中的初始座標 oldmx = x, oldmy = y; } /* 處理滑鼠拖動 */ void onMouseMove(int x, int y) { // printf("%d\n",du); du += x - oldmx; //滑鼠在視窗x軸方向上的增量加到視點繞y軸的角度上,這樣就左右轉了 h += 0.3f*(y - oldmy); //滑鼠在視窗y軸方向上的改變加到視點的y座標上,就上下轉了,防止轉過度,超出範圍,會呈現出“消失”的現象 oldmx = x, oldmy = y; //把此時的滑鼠座標作為舊值,為下一次計算增量做準備 } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(480, 480); glutCreateWindow("OpenGL顏色立方體"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(display); // 設定不斷呼叫顯示函式 glutSpecialFunc(key_board); // 設定鍵盤↑ ↓ ← → 調整函式 glutMouseFunc(Mouse); // 滑鼠處理函式 glutMotionFunc(onMouseMove); init(); glutMainLoop(); return 0; }

執行結果
RGB顏色立方體