【OpenGL】OpenGL顏色立方體
阿新 • • 發佈:2019-02-04
使用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;
}
執行結果