?? 3d.cpp
字號:
/*
* 這些代碼是由Jeff Molofee 與2000年寫的,再次我必須感謝Fredric Echols,因為他使這些代碼看起來更簡潔和高效,并使他易于使用。
* 如果你發(fā)現(xiàn)這些代碼對你有所幫助,請訪問我的站點 http://nehe.gamedev.net/default.asp ,并讓我知道。
*********************************************************************************************************************************
* 這份文檔是由DancingWind翻譯的,如果有什么錯誤請e-mail:zhouwei02@mails.tsinghua.edu.cn
* 基于04_Rotate。cpp文件修改
* //old code //不用了代碼用//刪除
* /********************************************************************************************************************/ /*
* new code //新的代碼位于兩排/*************/ /*之間,便于查找
* /********************************************************************************************************************/ /*
/***********************************新添的代碼***********************************************************************************/
/********************************************************************************************************************************/
/*********************包含鏈接的庫文件*******************************************************************************************/
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glut32.lib")
#pragma comment( lib, "glew32.lib")
#pragma comment( lib, "glaux.lib")
#pragma comment( lib, "vfw32.lib" )
/********************************************************************************************************************************/
#include <windows.h> // Windows的頭文件
#include "glew.h" // 包含最新的gl.h,glu.h庫
#include "glut.h" // 包含OpenGL實用庫
HDC hDC=NULL; // 窗口著色描述表句柄
HGLRC hRC=NULL; // OpenGL渲染描述表句柄
HWND hWnd=NULL; // 保存我們的窗口句柄
HINSTANCE hInstance; // 保存程序的實例
bool keys[256]; // 保存鍵盤按鍵的數(shù)組
bool active=TRUE; // 窗口的活動標志,缺省為TRUE
bool fullscreen=TRUE; // 全屏標志缺省,缺省設定成全屏模式
GLfloat rtri; // 用于三角形的角度
GLfloat rquad; // 用于四邊形的角度
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定義
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置OpenGL窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 將Height設為1
}
glViewport(0,0,width,height); // 重置當前的視口
glMatrixMode(GL_PROJECTION); // 選擇投影矩陣
glLoadIdentity(); // 重置投影矩陣
// 設置視口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 選擇模型觀察矩陣
glLoadIdentity(); // 重置模型觀察矩陣
}
int InitGL(GLvoid) // 此處開始對OpenGL進行所有設置
{
glShadeModel(GL_SMOOTH); // 啟用陰影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
glClearDepth(1.0f); // 設置深度緩存
glEnable(GL_DEPTH_TEST); // 啟用深度測試
glDepthFunc(GL_LEQUAL); // 所作深度測試的類型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告訴系統(tǒng)對透視進行修正
return TRUE; // 初始化 OK
}
int DrawGLScene(GLvoid) // 從這里開始進行所有的繪制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
glLoadIdentity(); // 重置當前的模型觀察矩陣
glTranslatef(-1.5f,0.0f,-6.0f); // 左移 1.5 單位,并移入屏幕 6.0
glRotatef(rtri,0.0f,1.0f,0.0f); // 繞Y軸旋轉(zhuǎn)三角形
// glBegin(GL_TRIANGLES); // 繪制三角形
// glColor3f(1.0f,0.0f,0.0f); // 設置當前色為紅色
// glVertex3f( 0.0f, 1.0f, 0.0f); // 上頂點
// glColor3f(0.0f,1.0f,0.0f); // 設置當前色為綠色
// glVertex3f(-1.0f,-1.0f, 0.0f); // 左下
// glColor3f(0.0f,0.0f,1.0f); // 設置當前色為藍色
// glVertex3f( 1.0f,-1.0f, 0.0f); // 右下
// glEnd(); // 三角形繪制結(jié)束
/***********************************新添的代碼***********************************************************************************/
glBegin(GL_TRIANGLES); // 開始繪制金字塔的各個面
glColor3f(1.0f,0.0f,0.0f); // 紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上頂點 (前側(cè)面)
glColor3f(0.0f,1.0f,0.0f); // 綠色
glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的左下頂點 (前側(cè)面)
glColor3f(0.0f,0.0f,1.0f); // 藍色
glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的右下頂點 (前側(cè)面)
glColor3f(1.0f,0.0f,0.0f); // 紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上頂點 (右側(cè)面)
glColor3f(0.0f,0.0f,1.0f); // 藍色
glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的左下頂點 (右側(cè)面)
glColor3f(0.0f,1.0f,0.0f); // 綠色
glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的右下頂點 (右側(cè)面)
glColor3f(1.0f,0.0f,0.0f); // 紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上頂點 (后側(cè)面)
glColor3f(0.0f,1.0f,0.0f); // 綠色
glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的左下頂點 (后側(cè)面)
glColor3f(0.0f,0.0f,1.0f); // 藍色
glVertex3f(-1.0f,-1.0f, -1.0f); // 三角形的右下頂點 (后側(cè)面)
glColor3f(1.0f,0.0f,0.0f); // 紅色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上頂點 (左側(cè)面)
glColor3f(0.0f,0.0f,1.0f); // 藍色
glVertex3f(-1.0f,-1.0f,-1.0f); // 三角形的左下頂點 (左側(cè)面)
glColor3f(0.0f,1.0f,0.0f); // 綠色
glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的右下頂點 (左側(cè)面)
glEnd(); // 金字塔繪制結(jié)束
/********************************************************************************************************************************/
// glTranslatef(3.0f,0.0f,0.0f); // 右移3單位
// glColor3f(0.5f,0.5f,1.0f); // 一次性將當前色設置為藍色
// glLoadIdentity(); // 重置模型觀察矩陣
// glTranslatef(1.5f,0.0f,-6.0f); // 右移1.5單位,并移入屏幕 6.0
// glRotatef(rquad,1.0f,0.0f,0.0f); // 繞X軸旋轉(zhuǎn)四邊形
// rtri+=0.2f; // 增加三角形的旋轉(zhuǎn)變量
// rquad-=0.15f; // 減少四邊形的旋轉(zhuǎn)變量
// glBegin(GL_QUADS); // 繪制正方形
// glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
// glVertex3f( 1.0f, 1.0f, 0.0f); // 右上
// glVertex3f( 1.0f,-1.0f, 0.0f); // 左下
// glVertex3f(-1.0f,-1.0f, 0.0f); // 右下
// glEnd(); // 正方形繪制結(jié)束
/***********************************新添的代碼***********************************************************************************/
glLoadIdentity(); // 把模型變換矩陣清零
glTranslatef(1.5f,0.0f,-7.0f); // 先右移再移入屏幕
glRotatef(rquad,1.0f,1.0f,1.0f); // 在XYZ軸上旋轉(zhuǎn)立方體
glBegin(GL_QUADS); // 開始繪制立方體
glColor3f(0.0f,1.0f,0.0f); // 顏色改為藍色
glVertex3f( 1.0f, 1.0f,-1.0f); // 四邊形的右上頂點 (頂面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四邊形的左上頂點 (頂面)
glVertex3f(-1.0f, 1.0f, 1.0f); // 四邊形的左下頂點 (頂面)
glVertex3f( 1.0f, 1.0f, 1.0f); // 四邊形的右下頂點 (頂面)
glColor3f(1.0f,0.5f,0.0f); // 顏色改成橙色
glVertex3f( 1.0f,-1.0f, 1.0f); // 四邊形的右上頂點(底面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四邊形的左上頂點(底面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四邊形的左下頂點(底面)
glVertex3f( 1.0f,-1.0f,-1.0f); // 四邊形的右下頂點(底面)
glColor3f(1.0f,0.0f,0.0f); // 顏色改成紅色
glVertex3f( 1.0f, 1.0f, 1.0f); // 四邊形的右上頂點(前面)
glVertex3f(-1.0f, 1.0f, 1.0f); // 四邊形的左上頂點(前面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四邊形的左下頂點(前面)
glVertex3f( 1.0f,-1.0f, 1.0f); // 四邊形的右下頂點(前面)
glColor3f(1.0f,1.0f,0.0f); // 顏色改成黃色
glVertex3f( 1.0f,-1.0f,-1.0f); // 四邊形的右上頂點(后面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四邊形的左上頂點(后面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四邊形的左下頂點(后面)
glVertex3f( 1.0f, 1.0f,-1.0f); // 四邊形的右下頂點(后面)
glColor3f(0.0f,0.0f,1.0f); // 顏色改成藍色
glVertex3f(-1.0f, 1.0f, 1.0f); // 四邊形的右上頂點(左面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四邊形的左上頂點(左面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四邊形的左下頂點(左面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四邊形的右下頂點(左面)
glColor3f(1.0f,0.0f,1.0f); // 顏色改成紫羅蘭色
glVertex3f( 1.0f, 1.0f,-1.0f); // 四邊形的右上頂點(右面)
glVertex3f( 1.0f, 1.0f, 1.0f); // 四邊形的左上頂點(右面)
glVertex3f( 1.0f,-1.0f, 1.0f); // 四邊形的左下頂點(右面)
glVertex3f( 1.0f,-1.0f,-1.0f); // 四邊形的右下頂點(右面)
glEnd(); // 立方體繪制結(jié)束
rtri+=0.2f; // 增加三角形的旋轉(zhuǎn)變量
rquad-=0.15f; // 減少四邊形的旋轉(zhuǎn)變量
/********************************************************************************************************************************/
return TRUE; // 一切 OK
}
GLvoid KillGLWindow(GLvoid) // 正常銷毀窗口
{
if (fullscreen) // 我們處于全屏模式嗎?
{
ChangeDisplaySettings(NULL,0); // 是的話,切換回桌面
ShowCursor(TRUE); // 顯示鼠標指針
}
if (hRC) //我們擁有OpenGL描述表嗎?
{
if (!wglMakeCurrent(NULL,NULL)) // 我們能否釋放DC和RC描述表?
{
MessageBox(NULL,"釋放DC或RC失敗。","關(guān)閉錯誤",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // 我們能否刪除RC?
{
MessageBox(NULL,"釋放RC失敗。","關(guān)閉錯誤",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // 將RC設為 NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // 我們能否釋放 DC?
{
MessageBox(NULL,"釋放DC失敗。","關(guān)閉錯誤",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // 將 DC 設為 NULL
}
if (hWnd && !DestroyWindow(hWnd)) // 能否銷毀窗口?
{
MessageBox(NULL,"釋放窗口句柄失敗。","關(guān)閉錯誤",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // 將 hWnd 設為 NULL
}
if (!UnregisterClass("OpenG",hInstance)) // 能否注銷類?
{
MessageBox(NULL,"不能注銷窗口類。","關(guān)閉錯誤",MB_OK | MB_ICONINFORMATION);
hInstance=NULL; // 將 hInstance 設為 NULL
}
}
/* 這個函數(shù)創(chuàng)建我們OpenGL窗口,參數(shù)為: *
* title - 窗口標題 *
* width - 窗口寬度 *
* height - 窗口高度 *
* bits - 顏色的位深(8/16/32) *
* fullscreenflag - 是否使用全屏模式,全屏模式(TRUE),窗口模式(FALSE) */
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat; // 保存查找匹配的結(jié)果
WNDCLASS wc; // 窗口類結(jié)構(gòu)
DWORD dwExStyle; // 擴展窗口風格
DWORD dwStyle; // 窗口風格
RECT WindowRect; // 取得矩形的左上角和右下角的坐標值
WindowRect.left=(long)0; // 將Left 設為 0
WindowRect.right=(long)width; // 將Right 設為要求的寬度
WindowRect.top=(long)0; // 將Top 設為 0
WindowRect.bottom=(long)height; // 將Bottom 設為要求的高度
fullscreen=fullscreenflag; // 設置全局全屏標志
hInstance = GetModuleHandle(NULL); // 取得我們窗口的實例
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 移動時重畫,并為窗口取得DC
wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc處理消息
wc.cbClsExtra = 0; // 無額外窗口數(shù)據(jù)
wc.cbWndExtra = 0; // 無額外窗口數(shù)據(jù)
wc.hInstance = hInstance; // 設置實例
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // 裝入缺省圖標
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 裝入鼠標指針
wc.hbrBackground = NULL; // GL不需要背景
wc.lpszMenuName = NULL; // 不需要菜單
wc.lpszClassName = "OpenG"; // 設定類名字
if (!RegisterClass(&wc)) // 嘗試注冊窗口類
{
MessageBox(NULL,"注冊窗口失敗","錯誤",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // 退出并返回FALSE
}
if (fullscreen) // 要嘗試全屏模式嗎?
{
DEVMODE dmScreenSettings; // 設備模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // 確保內(nèi)存清空為零
dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Devmode 結(jié)構(gòu)的大小
dmScreenSettings.dmPelsWidth = width; // 所選屏幕寬度
dmScreenSettings.dmPelsHeight = height; // 所選屏幕高度
dmScreenSettings.dmBitsPerPel = bits; // 每象素所選的色彩深度
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -