1. 程式人生 > >圖解opengl 3D 圖形繪製例項

圖解opengl 3D 圖形繪製例項

VC6 下載
http://blog.csdn.net/bcbobo21cn/article/details/44200205

opengl環境配置
http://blog.csdn.net/bcbobo21cn/article/details/51044614#t4

以下的demo工程

http://pan.baidu.com/s/1pLgmScj

一 3D旋轉物體

碼碼:

//在視窗和全屏模式下切換,按ESC退出。

#include <Windows.h> //Windows的標頭檔案
#include <gl/glut.h> //包含OpenGL實用庫

HGLRC hRC=NULL; //視窗著色描述表控制代碼
HDC hDC=NULL;//OpenGL渲染描述表控制代碼
HWND hWnd=NULL; //儲存視窗控制代碼
HINSTANCE hInstance; //儲存程式例項

bool keys[256];//儲存鍵盤按鍵的陣列
bool active=TRUE;//視窗的活動標誌,預設為TRUE
bool fullscreen=TRUE; //全屏標誌預設,預設設定成全屏模式

GLfloat rtri;//用於三角形的角度
GLfloat rquad;//用於四邊形的角度

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//WndProc的定義

//重置OpenGL視窗大小
GLvoid ResizeGLScene(GLsizei width,GLsizei height)
{
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.0f);//黑色背景
glClearDepth(1.0f);//設定深度快取
glEnable(GL_DEPTH_TEST);//啟用深度測試
glDepthFunc(GL_LEQUAL);//所作深度測試的型別
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//告訴系統對透視進行修正

return TRUE;
}

//進行繪製
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軸旋轉金字塔
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,1.0f);//左下(前側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(1.0f,-1.0f,1.0f);//右下(前側面)

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,1.0f);//左下(右側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(1.0f,-1.0f,-1.0f);//右下(右側面)

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,-1.0f);//左下(後側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(-1.0f,-1.0f,-1.0f);//右下(後側面)

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,-1.0f);//左下(左側面)
glColor3f(0.0f,0.0f,1.0f);//設定當前色為藍色
glVertex3f(-1.0f,-1.0f,1.0f);//右下(左側面)

glEnd();//三角形繪製結束

glLoadIdentity();//重置模型觀察矩陣
glTranslatef(1.5f,0.0f,-7.0f);//先右移再移入螢幕
glRotatef(rquad,1.0f,1.0f,1.0f);//繞XYZ軸旋轉立方體

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();

//<控制旋轉速度>
rtri +=0.02f;   //增加三角形的旋轉變數
rquad -=0.015f; //減少四邊形的旋轉變數

return TRUE;
}

GLvoid KillGLWindow(GLvoid)//正常銷燬視窗
{
if(fullscreen)//是否處於全屏模式
{
ChangeDisplaySettings(NULL,0); //是的話,切換回桌面
ShowCursor(TRUE);//顯示滑鼠指標
}

if(hRC)//是否擁有OpenGL渲染描述表
{
if(!wglMakeCurrent(NULL,NULL)) //能否是否DC和RC描述表
{
MessageBox(NULL,"釋放DC或RC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
}

if(!wglDeleteContext(hRC)) //能否刪除RC
{
MessageBox(NULL,"釋放RC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
}

hRC = NULL;
}

if(hDC && !ReleaseDC(hWnd,hDC)) //能否釋放DC
{
MessageBox(NULL,"釋放DC失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
hDC = NULL;
}

if(hWnd && !DestroyWindow(hWnd)) //能否銷燬視窗
{
MessageBox(NULL,"釋放視窗控制代碼失敗。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
hWnd = NULL;
}

if(!UnregisterClass("OpenGL",hInstance)) //能否登出視窗類
{
MessageBox(NULL,"不能登出視窗類。","關閉錯誤",MB_OK | MB_ICONINFORMATION );
hInstance = NULL;
}
}

BOOL CreateGLWindow(char * title,int width,int height,int bits,bool fullscreenflag)
{
GLuint PixelFormat;//儲存查詢匹配的結果
WNDCLASS wc;//視窗類結構
DWORD dwExStyle; //擴充套件視窗風格
DWORD dwStyle;//視窗風格
RECT WindowRect;//取得矩形的左上角和右下角的座標值
WindowRect.left=(long)0;//將Left設為0
WindowRect.right=(long)width;//將Right設為要求的寬度
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;

fullscreen = fullscreenflag;//設定全域性全屏標誌

hInstance         = GetModuleHandle(NULL);//取得視窗的例項
wc.style          = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;//移動時重畫,併為視窗取得DC
wc.lpfnWndProc    = WndProc;//WndProc處理訊息
wc.cbClsExtra     = 0;//無額外視窗資料Specifies the number of extra bytes to allocate following the window-class structure. 
wc.cbWndExtra     = 0; //無額外視窗資料Specifies the number of extra bytes to allocate following the window instance.
wc.hInstance      = hInstance;//設定例項
wc.hIcon          = LoadIcon(NULL,IDI_WINLOGO);//裝入預設圖示
wc.hCursor        = LoadCursor(NULL,IDC_ARROW);//裝入滑鼠指標
wc.hbrBackground  = NULL;         //GL不需要背景
wc.lpszMenuName   = NULL ;         //不需要選單
wc.lpszClassName  = "OpenGL";     //設定類名字

if(!RegisterClass(&wc)) //嘗試註冊視窗類
{
MessageBox(NULL,"註冊視窗失敗","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

if(fullscreen)
{
DEVMODE dmScreenSettings; //裝置模式
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));//確保記憶體清空為零
dmScreenSettings.dmSize=sizeof(dmScreenSettings);//Devmode結構的大小
dmScreenSettings.dmPelsWidth = width;//所選螢幕寬度
dmScreenSettings.dmPelsHeight = height;//所選螢幕高度
dmScreenSettings.dmBitsPerPel = bits; //每畫素所選的色彩濃度
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

//嘗試設定顯示模式並返回結果。注:CDS_FULLSCREEN移去了狀態條。
if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
//若模式失敗,提供兩個選項:退出或在視窗內執行。
if(MessageBox(NULL,"全屏模式在當前顯示卡上設定失敗!\n使用視窗模式?",
"提示",MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
{
fullscreen = FALSE;//選擇視窗模式
}
else
{
//彈出一個對話方塊,告訴使用者程式結束
MessageBox(NULL,"程式將被關閉","錯誤",MB_OK | MB_ICONSTOP);
return FALSE;
}
}
}

if(fullscreen)
{
dwExStyle = WS_EX_APPWINDOW; //擴充套件窗體風格
dwStyle = WS_POPUP; //窗體風格
ShowCursor(FALSE); //隱藏滑鼠指標
}
else
{
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;//擴充套件窗體風格
dwStyle = WS_OVERLAPPEDWINDOW; //窗體風格
}

AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);//調整視窗達到真正要求的大小

//窗體自適應各種解析度以居中方式顯示
LONG nX, nY;

nX = (::GetSystemMetrics(SM_CXSCREEN) - width) / 2;
nY = (::GetSystemMetrics(SM_CYSCREEN) - height) / 2;

if(!(hWnd = CreateWindowEx(dwExStyle, //擴充套件窗體風格
"OpenGL", //類名字
title,    //視窗標題
WS_CLIPSIBLINGS | WS_CLIPCHILDREN| //必須的窗體風格屬性
dwStyle,   //選擇的窗體屬性
nX,nY,   //視窗位置
WindowRect.right - WindowRect.left, //計算調整好的視窗寬度
WindowRect.bottom - WindowRect.top, //計算調整好的窗體高度
NULL, //無父視窗
NULL, //無選單
hInstance, //例項
NULL))) //不向WM_CREATE傳遞任何東西
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能建立一個視窗裝置描述表","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

static PIXELFORMATDESCRIPTOR pfd = //pdf告訴視窗希望的東西,即視窗使用的畫素格式
{
sizeof(PIXELFORMATDESCRIPTOR), //上述格式描述符的大小
1,       //版本號
PFD_DRAW_TO_WINDOW |  //格式支援視窗
PFD_SUPPORT_OPENGL |  //格式支援OpenGL
PFD_DOUBLEBUFFER,  //支援雙緩衝
PFD_TYPE_RGBA,     //申請RGBA格式
bits,              //選定色彩深度
0,0,0,0,0,0,       //忽略的色彩位
0,                 //無Alpha快取
0,                 //忽略Shift Bit
0,                 //無累加快取
0,0,0,0,           //忽略聚集位
16,                //16位Z-快取(深度快取)
0,                 //無蒙板快取
0,                 //無輔助快取
PFD_MAIN_PLANE,    //主繪圖層
0,                 //Reserved
0,0,0              //忽略層遮罩
};

if(!(hDC = GetDC(hWnd))) //是否取得裝置描述表
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能建立一種相匹配的畫素格式","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

if(!(PixelFormat = ChoosePixelFormat(hDC,&pfd))) //Windows是否找到相應的畫素格式
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能設定畫素格式","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

if(!SetPixelFormat(hDC,PixelFormat,&pfd)) //是否能夠設定畫素格式
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能設定畫素格式","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

if (!(hRC = wglCreateContext(hDC))) //能否取得著色描述表
{
KillGLWindow();//重置顯示區
MessageBox(NULL,"不能建立OpenGL渲染描述表","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

if(!wglMakeCurrent(hDC,hRC)) //嘗試啟用著色描述表
{
KillGLWindow();
MessageBox(NULL,"不能啟用當前的OpenGL渲染描述表","錯誤",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

ShowWindow(hWnd,SW_SHOW);//顯示視窗
SetForegroundWindow(hWnd);//提供優先級別
SetFocus(hWnd);//設定鍵盤的焦點至此視窗
ResizeGLScene(width,height);//設定透視GL螢幕

if (!InitGL()) //初始化新建的GL視窗
{
KillGLWindow();
MessageBox(NULL,"Initialization","ERROR",MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}

return TRUE;
}

//處理所有的視窗訊息
LRESULT CALLBACK WndProc(HWND hWnd,//視窗的控制代碼
UINT uMsg,//視窗的訊息
WPARAM wParam,//附加的訊息內容
LPARAM lParam) //附加的訊息內容
{
switch(uMsg) //檢查檢查Windows訊息
{
case WM_ACTIVATE:  //監視視窗啟用訊息
{
if(!HIWORD(wParam)) //檢查最小化狀態
{
active = TRUE; //程式處於啟用狀態
}
else
{
active = FALSE;//程式不再啟用
}

return 0;//返回訊息迴圈
}

case WM_SYSCOMMAND: //系統中斷命令
{
switch(wParam) //檢查系統呼叫
{
case  SC_SCREENSAVE: //屏保執行
case SC_MONITORPOWER: //顯示器進入節電模式
return 0; //阻止發生
}
break; //退出
}
case WM_CLOSE: //收到Close訊息
{
PostQuitMessage(0);//發出退出訊息
return 0;
}
case WM_KEYDOWN: //有鍵按下
{
keys[wParam] = TRUE;
return 0;
}
case WM_KEYUP: //有鍵放開
{
keys[wParam] = FALSE;
return 0;
}
case WM_SIZE: //調整OpenGL視窗大小
{
ResizeGLScene(LOWORD(lParam),HIWORD(lParam));//LOWORD=width,HIWORD=height
return 0;
}
}

//向DefWindowProc傳遞所有未處理的訊息
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

//Windows程式的入口,呼叫視窗建立例程,處理視窗訊息,並監視人機互動。
int WINAPI WinMain(HINSTANCE hInstance,//當前視窗例項
  HINSTANCE hPrevInstance, //前一個視窗例項
  LPSTR lpCmdLine, //命令列引數
  int nCmdShow) //視窗顯示狀態
{
MSG msg;//Windows訊息結構
BOOL done=FALSE;//用來退出迴圈的BOOL變數
//提示使用者選擇執行模式
if (MessageBox(NULL,"你想在全屏模式下執行麼?","設定全屏模式",MB_YESNO | MB_ICONQUESTION) == IDNO)
{
fullscreen = FALSE; //設定為視窗模式
}

//建立OpenGL視窗
if(!CreateGLWindow("OpenGL 3D 旋轉物體",640,480,16,fullscreen))
{
return 0;       //失敗退出
}

while(!done)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //是否有訊息在等待
{
if(msg.message == WM_QUIT) //收到退出訊息
{
done = TRUE;
}
else //處理視窗訊息
{
TranslateMessage(&msg);  //翻譯訊息
DispatchMessage(&msg);   //傳送訊息
}
}
else //如果沒有訊息
{
//繪製場景。監視ESC鍵和來自DrawGLScene()的退出訊息
if(active)
{
if(keys[VK_ESCAPE])
{
done = TRUE;
}
else //沒有退出,重新整理螢幕
{
DrawGLScene();//繪製場景
SwapBuffers(hDC);//交換快取(雙快取)
}
}
if(keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen = !fullscreen;//切換全屏/視窗模式
//重建OpenGL視窗
if(!CreateGLWindow("3D旋轉例項",640,480,16,fullscreen))
{
return 0;
}
}
}
}

//關閉程式
KillGLWindow(); //銷燬視窗
return (msg.wParam); //退出程式
}

效果:


程式碼比較長;用notepad++摺疊起來看下函式;


二 3D機器人

程式碼:
#include <gl/glut.h>
#include <stdlib.h>
#include <stdio.h>

#define SOLID 1
#define WIRE 2

int moveX,moveY;
int spinX = 0;
int spinY = 0;
int des = 0;

void init() {
   //定義光源的顏色和位置
   GLfloat ambient[] = { 0.5, 0.8, 0.1, 0.1 };  
   GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };  
   GLfloat position[] = { -80.0, 50.0, 25.0, 1.0 };  
   //選擇光照模型
   GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };  
   GLfloat local_view[] = { 0.0 };  
   glClearColor(0.0, 0.0, 0.0, 0.0);   
   glShadeModel(GL_SMOOTH);  
   //設定環境光
   glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);  
   //設定漫射光
   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);  
   //設定光源位置
   glLightfv(GL_LIGHT0, GL_POSITION, position);  
   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);  
   glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);  
   //啟動光照
   glEnable(GL_LIGHTING);  
   //啟用光源
   glEnable(GL_LIGHT0);  
}

//畫球
void drawBall(double R, double x, double y,double z, int MODE) {
	glPushMatrix();
	glTranslated(x,y,z);
	if (MODE == SOLID) {
		glutSolidSphere(R,20,20);
	} else if (MODE ==WIRE) {
		glutWireSphere(R,20,20);
	}
	glPopMatrix();
}

//畫半球
void drawHalfBall(double R, double x, double y,double z, int MODE) {
	glPushMatrix();
	glTranslated(x,y,z);
	GLdouble eqn[4]={0.0, 1.0, 0.0, 0.0};
	glClipPlane(GL_CLIP_PLANE0,eqn);
	glEnable(GL_CLIP_PLANE0);
	if (MODE == SOLID) {
		glutSolidSphere(R,20,20);
	} else if (MODE ==WIRE) {
		glutWireSphere(R,20,20);
	}
	glDisable(GL_CLIP_PLANE0);
	glPopMatrix();
}

//畫長方體
void drawSkewed(double l, double w, double h, double x, double y, double z, int MODE) {
	glPushMatrix();
	glScaled(l, w, h);
	glTranslated(x, y, z);
	if (MODE == SOLID) {
		glutSolidCube(1);
	} else if (MODE ==WIRE) {
		glutWireCube(1);
	}
	glPopMatrix();
}

void display(void) {
	//清除緩衝區顏色
	glClear(GL_COLOR_BUFFER_BIT);
	//定義白色
	glColor3f(1.0, 1.0, 1.0); 
	//圓點放座標中心
	glLoadIdentity();  
	//從哪個地方看
	gluLookAt(-2.0, -1.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 
	glPushMatrix();
	glRotated(spinX, 0, 1, 0);
	glRotated(spinY, 1, 0, 0);
	glTranslated(0, 0, des);
	//頭
	drawBall(2, 0, 1, 0, SOLID);
	//身體
	drawSkewed(5, 4.4, 4, 0, -0.75, 0, SOLID);
	//肩膀
	drawHalfBall(1, 3.5, -2.1, 0, SOLID);
	drawHalfBall(1, -3.5, -2.1, 0, SOLID);
	//胳膊
	drawSkewed(1, 3, 1, 3.5, -1.3, 0, SOLID);
	drawSkewed(1, 3, 1, -3.5, -1.3, 0, SOLID);
	//手
	drawBall(1, 3.5, -6.4, 0, SOLID);
	drawBall(1, -3.5, -6.4, 0, SOLID);
	//腿
	drawSkewed(1.2, 3, 2, 1, -2.4, 0, SOLID);
	drawSkewed(1.2, 3, 2, -1, -2.4, 0, SOLID);
	//腳
	drawSkewed(1.5, 1, 3, 0.9, -9.2, 0, SOLID);
	drawSkewed(1.5, 1, 3, -0.9, -9.2, 0, SOLID);
	glPopMatrix();
    glutSwapBuffers();
}
//滑鼠點選事件
void mouseClick(int btn, int state, int x, int y) {
    moveX = x;
	moveY = y;
	GLfloat ambient[] = { (float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX, 0.1 };  
	 //設定環境光
	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);  
	//啟用光源
	glEnable(GL_LIGHT0);  
}

//鍵盤事件
void keyPressed(unsigned char key, int x, int y) {
    switch (key) {
    case 'a':
        spinX -= 2;
        break;
    case 'd':
         spinX += 2;  
        break;
    case 'w':
        des += 2;
        break;
    case 's':
        des -= 2;
		break;
	}
	glutPostRedisplay();
}
// 滑鼠移動事件 
void mouseMove(int x, int y) {
	int dx = x - moveX;
	int dy = y - moveY;
	printf("dx;%dx,dy:%dy\n",dx,dy);
	spinX += dx;
	spinY += dy;
	glutPostRedisplay();
	moveX = x;
	moveY = y;
}

void reshape(int w, int h) {
	//定義視口大小
	glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
	//投影顯示
	glMatrixMode(GL_PROJECTION);
	//座標原點在螢幕中心
	glLoadIdentity();
	//操作模型視景
	gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
	glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv) {
	//初始化
	glutInit(&argc, argv);
	//設定顯示模式
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	//初始化視窗大小
	glutInitWindowSize(500, 500); 
	//定義左上角視窗位置
	glutInitWindowPosition(100, 100);
	//建立視窗
	glutCreateWindow(argv[0]);
	//初始化
	init();
	//顯示函式
	glutDisplayFunc(display);
	//視窗大小改變時的響應
	glutReshapeFunc(reshape);
	//滑鼠點選事件,滑鼠點選或者鬆開時呼叫
    glutMouseFunc(mouseClick);
	//滑鼠移動事件,滑鼠按下並移動時呼叫
    glutMotionFunc(mouseMove);
	//鍵盤事件
	glutKeyboardFunc(keyPressed);
	//迴圈
	glutMainLoop();
	return 0;
}
效果;


摺疊其程式碼來看下函式;


三 繪製立方體

程式碼:
#include <gl/glut.h>  //引用相關包

void display(void)
{
 
 glClear(GL_COLOR_BUFFER_BIT);  //清空顏色緩衝區
 glColor3f(0,1,1);   //重置顏色
 glLoadIdentity();   //清空矩陣
 glTranslatef(0,0,-5); //將場景中的物體沿z軸負方向移動5個單位長
 glRotatef(40,0,1,0);
 //gluLookAt(0,0,5,0,0,0,0,2,0); //視點變換
 glScalef(1,2,1);  //模型變換
 glutWireCube(1.2); //繪製實心立方體和線框立方體
 glFlush();   //重新整理視窗以顯示當前繪製圖形
} 
void init(void)
{
 glClearColor(0,0,0,0);
 glShadeModel(GL_FLAT); //選擇平面明暗模式或光滑明暗模式
}

void reshape(int w,int h)
{
 glViewport(0,0,(GLsizei)w,(GLsizei)h);   //設定機口
 glMatrixMode(GL_PROJECTION);  //指定哪一個矩陣是當前矩陣
 glLoadIdentity();
    gluPerspective(60,1,1.5,20);   //建立透視投影矩陣(fovy,aspect,zNear,zFar);
 //glFrustum(-1,1,-1,1,1.5,20.0);  //用透視矩陣乘以當前矩陣(left,Right,bottom,top,near,far);
 glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char *argv[])
{
 glutInit(&argc, argv); //固定格式
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);   //快取模式
 glutInitWindowSize(400, 400);    //顯示框的大小
    glutInitWindowPosition(400,400); //確定顯示框左上角的位置
    glutCreateWindow("繪製立方體");
 init();
    glutDisplayFunc(display);
 glutReshapeFunc(reshape);
    glutMainLoop(); //進人GLUT事件處理迴圈
    return 0;
}
效果:



上述分別是

glutWireCube(1.2);

glutWireCube(2.0);

的效果;

四 繪製立方體二

程式碼:

#include<windows.h>
#include<math.h>
 
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
 
#include <stdlib.h>
 
void init(void)
{
  glClearColor(0.75,0.75,0.75,0.0);
  glMatrixMode(GL_MODELVIEW);//設定當前矩陣模式為檢視模型矩陣
  glLoadIdentity();
//設定視點的位置,視線的方向和相機的向上方向
  gluLookAt(0,0,0, 0,0,-1, 0,1,0); //該設定為預設設定
  glScalef(0.3,1.0,0.5); //產生比例變換,分別設定物體在x,y,z方向上縮放因子,根據需要自己可以設定
  glRotatef(45,1.0,1.0,1.0);//產生旋轉變換,讓物體繞(1,1,1)軸旋轉45度
  glMatrixMode(GL_PROJECTION);//設定當前矩陣模式為投影矩陣
  glFrustum(-4,4,-4,4,0,20);////設定場景投影時的可視範圍
}
 //float points[8][3] = {{0,0,0},{0,0.5,0},{0.5,0,0},{0.5,0.5,0},{0,0,0.5},{0,0.5,0.5},{0.5,0,0.5},{0.5,0.5,0.5}};
 float points[8][3] = {{0,0,0},{0,0.75,0},{0.75,0,0},{0.75,0.75,0},{0,0,0.75},{0,0.75,0.75},{0.75,0,0.75},{0.75,0.75,0.75}};
 float colors[6][3] = {{0.25,0,0},{0.25,0.25,0.25},{0,0,0.25},{0.5,0.25,0},{0,0.25,0.25},{0.25,0,0.25}};
 
void vertexArray(void)
{
 glClear(GL_COLOR_BUFFER_BIT);
// glColor 3f(1.0,1.0,0.0);
 //glPolygonMode(GL_FRONT, GL_LINE);// 設定多邊形的顯示模式為面填充模式,該設定也是預設設定
 glFrontFace(GL_CCW); //設定前面的面的模式為逆時針模式, 該設定也是預設設定
 //glShadeModel(GL_SHADE_MODEL);// 預設就是此引數,可忽略,為了明確說明特意指定
 
 
void quad(GLint n1,GLint n2,GLint n3,GLint n4,GLint index);
    quad(6,2,3,7,1);
    quad(5,1,0,4,2);
    quad(7,3,1,5,3);
    quad(4,0,2,6,4);
    quad(2,0,1,3,5);
    quad(7,5,4,6,6);
glFlush();
}
 
void quad(GLint n1,GLint n2,GLint n3,GLint n4,GLint index)
{
    glColor3f(0.0,1.0,0.0);
    glEnable(GL_POLYGON_OFFSET_FILL);
    glPolygonOffset(1.0,1.0);
    glDisable(GL_POLYGON_OFFSET_FILL);
    glColor3f(colors[index][0],colors[index][1],colors[index][2]);
    //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    //glPolygonMode(GL_FRONT, GL_LINE);
    glPolygonMode(GL_BACK, GL_LINE);
    //glColor3f(1.0,1.0,0);
    glBegin(GL_QUADS);
        glVertex3fv(points[n1]);
        glVertex3fv(points[n2]);
        glVertex3fv(points[n3]);
        glVertex3fv(points[n4]);
    glEnd();
}
 
int main (int argc, char** argv)
{
 
    glutInit (&argc, argv);                         // Initialize GLUT.
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);   // Set display mode.
    glutInitWindowPosition (50, 100);   // Set top-left display-window position.
    glutInitWindowSize (600, 500);      // Set display-window width and height.
    glutCreateWindow ("An Example OpenGL Program"); // Create display window.
       init();                           // Execute initialization procedure.
    glutDisplayFunc (vertexArray);       // Send graphics to display window.
    glutMainLoop ( );// Send graphics to display window.                  // Display everything and wait.
       return 0;
}
效果:


五 任意兩點間畫圓柱體

#include <gl/glut.h>  
#include <cstdio>  
#include <cstdlib>  
#include <cmath>  
void    init(void);  
void    reshape(int w,int h);  
void    display(void);  
  
void RenderBone(float x0, float y0, float z0, float x1, float y1, float z1 );  
int main(int argc, char** argv)  
{  
    glutInit(&argc, argv);  
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);   
    glutInitWindowSize (500, 500);  
    glutInitWindowPosition (100, 100);  
    glutCreateWindow("Sphere");  
    init ();  
    glutReshapeFunc(reshape);  
    glutDisplayFunc(display);  
    glutMainLoop();  
    return 0;  
}  
void init (void)  
{   
    glClearColor (0.6, 0.6, 0.6, 0.0);  
    glClearDepth(1);  
    glShadeModel(GL_SMOOTH);  
    GLfloat _ambient[]={1.0,1.0,1.0,1.0};  
	//GLfloat _ambient[]={2.0,2.0,2.0,2.0};  
    GLfloat _diffuse[]={1.0,1.0,0.0,1.0};  
    GLfloat _specular[]={1.0,1.0,1.0,1.0};  
    GLfloat _position[]={300,300,300,0};  
    glLightfv(GL_LIGHT0,GL_AMBIENT,_ambient);  
    glLightfv(GL_LIGHT0,GL_DIFFUSE,_diffuse);  
    glLightfv(GL_LIGHT0,GL_SPECULAR,_specular);  
    glLightfv(GL_LIGHT0,GL_POSITION,_position);  
    glEnable(GL_TEXTURE_2D);  
    glEnable(GL_LIGHTING);  
    glEnable(GL_LIGHT0);  
    glEnable(GL_DEPTH_TEST);  
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  
}  
void reshape(int w, int h)  
{  
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);  
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();  
    glOrtho(0.0, 500, 0.0, 500, -500, 500);  
    glMatrixMode(GL_MODELVIEW);  
    glLoadIdentity();  
}  
void display(void)  
{  
    glMatrixMode(GL_MODELVIEW);  
    glLoadIdentity();  
    glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  
    glPushMatrix();  
    {  
        //RenderBone(100, 100, 100, 200, 300, 500);  
		RenderBone(200, 200, 200, 300, 400, 600);  
    } glPopMatrix();  
  
    glFlush();  
    glutPostRedisplay();  
}  
void RenderBone(float x0, float y0, float z0, float x1, float y1, float z1 )  
{  
    GLdouble  dir_x = x1 - x0;  
    GLdouble  dir_y = y1 - y0;  
    GLdouble  dir_z = z1 - z0;  
    GLdouble  bone_length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );  
    static GLUquadricObj *  quad_obj = NULL;  
    if ( quad_obj == NULL )  
        quad_obj = gluNewQuadric();  
    gluQuadricDrawStyle( quad_obj, GLU_FILL );  
    gluQuadricNormals( quad_obj, GLU_SMOOTH );  
    glPushMatrix();  
    // 平移到起始點  
    glTranslated( x0, y0, z0 );  
    // 計算長度  
    double  length;  
    length = sqrt( dir_x*dir_x + dir_y*dir_y + dir_z*dir_z );  
    if ( length < 0.0001 ) {   
        dir_x = 0.0; dir_y = 0.0; dir_z = 1.0;  length = 1.0;  
    }  
    dir_x /= length;  dir_y /= length;  dir_z /= length;  
    GLdouble  up_x, up_y, up_z;  
    up_x = 0.0;  
    up_y = 1.0;  
    up_z = 0.0;  
    double  side_x, side_y, side_z;  
    side_x = up_y * dir_z - up_z * dir_y;  
    side_y = up_z * dir_x - up_x * dir_z;  
    side_z = up_x * dir_y - up_y * dir_x;  
    length = sqrt( side_x*side_x + side_y*side_y + side_z*side_z );  
    if ( length < 0.0001 ) {  
        side_x = 1.0; side_y = 0.0; side_z = 0.0;  length = 1.0;  
    }  
    side_x /= length;  side_y /= length;  side_z /= length;  
    up_x = dir_y * side_z - dir_z * side_y;  
    up_y = dir_z * side_x - dir_x * side_z;  
    up_z = dir_x * side_y - dir_y * side_x;  
    // 計算變換矩陣  
    GLdouble  m[16] = { side_x, side_y, side_z, 0.0,  
        up_x,   up_y,   up_z,   0.0,  
        dir_x,  dir_y,  dir_z,  0.0,  
        0.0,    0.0,    0.0,    1.0 };  
    glMultMatrixd( m );  
    // 圓柱體引數  
    GLdouble radius= 25;        // 半徑  
    GLdouble slices = 8.0;      //  段數  
    GLdouble stack = 3.0;       // 遞迴次數  
    gluCylinder( quad_obj, radius, radius, bone_length, slices, stack );   
    glPopMatrix();  
} 
效果:


修改此句以改變半徑;

GLdouble radius= 25;        // 半徑

六 球體

#include <windows.h>  
#include <gl/GL.h>  
#include <gl/glu.h>  
#include <gl/glut.h>  
#include <cstdlib>  
const GLfloat lightPosition[] = {10.0,10.0,10.0,0.0};  
const GLfloat whiteLight[] = {0.8,0.8,0.8,1.0};  
GLfloat matSpecular [] = {0.3,0.3,0.3,1.0};  
GLfloat matShininess [] = {20.0};  
GLfloat matEmission [] = {0.3,0.3,0.3,1.0};  
GLfloat spin = 0;  
void init()  
{  
    glClearColor(0.3,0.3,0.3,1.0);  
    glClearDepth(1.0);  
    glShadeModel(GL_SMOOTH);  
    glEnable(GL_LIGHTING);  
    glEnable(GL_LIGHT0);  
    glEnable(GL_DEPTH_TEST);  
    glMatrixMode(GL_MODELVIEW);  
    glLoadIdentity();  
    glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);  
    glLightfv(GL_LIGHT0,GL_DIFFUSE,whiteLight);  
    glLightfv(GL_LIGHT0,GL_SPECULAR,whiteLight);  
}  
void display()  
{     
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();;  
    glOrtho(-10.0,10.0,-10.0,10.0,-10.0,10.0);  
      
    glMatrixMode(GL_MODELVIEW);  
    glPushMatrix();  
    glRotatef(spin,0.0,1.0,0.0);  
    glMaterialfv(GL_FRONT,GL_SPECULAR,matSpecular);  
    glMaterialfv(GL_FRONT,GL_SHININESS,matShininess);  
    glMaterialfv(GL_FRONT,GL_EMISSION,matEmission);  
    //glutSolidSphere(6.0,16,16);  
	glutSolidSphere(3.0,16,16);  
    glPopMatrix();  
    glFlush();  
}  
void reshape(int w,int h)  
{  
    glViewport(0.0,0.0,(GLsizei) w,(GLsizei) h);  
}  
void keyboardFunc(unsigned char key,int x,int y)  
{  
    switch(key)  
    {  
    case 'a':  
        spin +=30;  
        break;  
    case 'd':  
        spin -=30;  
        break;  
    }  
    if(spin<360)  
        spin +=360;  
    else if(spin>=360)  
        spin -=360;  
    glutPostRedisplay();  
}  
void mouseFunc(int button,int state,int x,int y)  
{  
    if(state==GLUT_DOWN){  
    switch (button)  
    {  
    case GLUT_LEFT_BUTTON:  
        matEmission[0]+=1.0;  
        if(matEmission[0]>1.0)  
            matEmission[0]-=1.1;  
        break;  
    case GLUT_MIDDLE_BUTTON:  
        matEmission[1]+=1.0;  
        if(matEmission[1]>1.0)  
            matEmission[1]-=1.1;  
        break;  
    case GLUT_RIGHT_BUTTON:  
        matEmission[2]+=1.0;  
        if(matEmission[2]>1.0)  
            matEmission[2]-=1.1;  
        break;  
    }  
    glutPostRedisplay();      
    }  
}  
int main(int argc,char *argv[])  
{     
    glutInit(&argc,argv);  
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);  
    glutInitWindowSize(450,450);  
    glutInitWindowPosition(150,150);  
    glutCreateWindow("rotate sphere");  
    glutDisplayFunc(display);  
    glutReshapeFunc(reshape);  
    glutKeyboardFunc(keyboardFunc);  
    glutMouseFunc(mouseFunc);  
    init();  
    glutMainLoop();  
    return EXIT_SUCCESS;  
} 
效果:


上述分別是

    //glutSolidSphere(6.0,16,16);  
glutSolidSphere(3.0,16,16); 

的效果;

七 球體,圓圈,茶壺......

#include <gl/glut.h>  
#include <math.h>  
#include <stdio.h>  
//圓周率巨集  
#define GL_PI 3.1415f  
//獲取螢幕的寬度  
GLint SCREEN_WIDTH=0;  
GLint SCREEN_HEIGHT=0;  
//設定程式的視窗大小  
GLint windowWidth=400;  
GLint windowHeight=300;  
//繞x軸旋轉角度  
GLfloat xRotAngle=0.0f;  
//繞y軸旋轉角度  
GLfloat yRotAngle=0.0f;  
//受支援的點大小範圍  
GLfloat sizes[2];  
//受支援的點大小增量  
GLfloat step;  
  
enum MODELS{  
    SPHERE=0,  
    CONE,  
    CUBE,  
    TORUS,  
    DODECAHEDRON,  
    TEAPOT,  
    OCTAHEDRON,  
    TETRAHEDRON,  
    ICOSAHEDRON  
};  
GLint iModel=SPHERE;  
GLboolean bWire=GL_TRUE;  
//選單回撥函式  
void processMenu(int value){  
    switch(value){  
        case 1:  
            iModel=SPHERE;  
            break;  
        case 2:  
            iModel=CONE;  
            break;  
        case 3:  
            iModel=CUBE;  
            break;  
        case 4:  
            iModel=TORUS;  
            break;  
        case 5:  
            iModel=DODECAHEDRON;  
            break;  
        case 6:  
            iModel=TEAPOT;  
            break;  
        case 7:  
            iModel=OCTAHEDRON;  
            break;  
        case 8:  
            iModel=TETRAHEDRON;  
            break;  
        case 9:  
            iModel=ICOSAHEDRON;  
            break;  
        case 10:  
            bWire=GL_TRUE;  
            break;  
        case 11:  
            bWire=GL_FALSE;  
            break;  
        default:  
            break;  
    }  
    //重新繪製  
    glutPostRedisplay();  
}  
//顯示回撥函式  
void renderScreen(void){  
    //將視窗顏色清理為黑色  
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  
    //將模板緩衝區值全部清理為1  
    glClearStencil(1);  
    //使能模板緩衝區  
    glEnable(GL_STENCIL_TEST);  
    //把整個視窗清理為當前清理顏色:黑色。清除深度緩衝區、模板緩衝區  
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);  
    //將當前Matrix狀態入棧  
    glPushMatrix();  
    //座標系繞x軸旋轉xRotAngle  
    glRotatef(xRotAngle,1.0f,0.0f,0.0f);  
    //座標系繞y軸旋轉yRotAngle  
    glRotatef(yRotAngle,0.0f,1.0f,0.0f);  
    //進行平滑處理   
    glEnable(GL_POINT_SMOOTH);  
    glHint(GL_POINT_SMOOTH,GL_NICEST);  
    glEnable(GL_LINE_SMOOTH);  
    glHint(GL_LINE_SMOOTH,GL_NICEST);  
    glEnable(GL_POLYGON_SMOOTH);  
    glHint(GL_POLYGON_SMOOTH,GL_NICEST);  
      
    //白色繪製座標系  
    glColor3f(1.0f,1.0f,1.0f);  
    glBegin(GL_LINES);  
        glVertex3f(-9.0f,0.0f,0.0f);  
        glVertex3f(9.0f,0.0f,0.0f);  
        glVertex3f(0.0f,-9.0f,0.0f);  
        glVertex3f(0.0f,9.0f,0.0f);  
        glVertex3f(0.0f,0.0f,-9.0f);  
        glVertex3f(0.0f,0.0f,9.0f);  
    glEnd();  
  
    glPushMatrix();  
    glTranslatef(9.0f,0.0f,0.0f);  
    glRotatef(90.0f,0.0f,1.0f,0.0f);  
    glutSolidCone(0.3,0.6,10,10);  
    glPopMatrix();  
  
    glPushMatrix();  
    glTranslatef(0.0f,9.0f,0.0f);  
    glRotatef(-90.0f,1.0f,0.0f,0.0f);  
    glutSolidCone(0.3,0.6,10,10);  
    glPopMatrix();  
  
    glPushMatrix();  
    glTranslatef(0.0f,0.0f,9.0f);  
    glRotatef(90.0f,0.0f,0.0f,1.0f);  
    glutSolidCone(0.3,0.6,10,10);  
    glPopMatrix();  
  
    //設定繪畫顏色為金色  
    glColor3f(0.0f,1.0f,0.0f);  
    switch(iModel){  
        //球  
        case SPHERE:  
            if(bWire){  
                glutWireSphere(8.0f,20,20);  
            }  
            else{  
                glutSolidSphere(8.0f,20,20);  
            }  
            break;  
        //錐體  
        case CONE:  
            if(bWire){  
                glutWireCone(4.0f,8.0f,20,20);  
            }  
            else{  
                glutSolidCone(4.0f,8.0f,20,20);  
            }  
            break;  
        //立體  
        case CUBE:  
            if(bWire){  
                glutWireCube(8.0f);  
            }  
            else{  
                glutSolidCube(8.0f);  
            }  
            break;  
        //甜圈  
        case TORUS:  
            if(bWire){  
                glutWireTorus(3.0f,6.0f,20,20);  
            }  
            else{  
                glutSolidTorus(3.0f,6.0f,20,20);  
            }  
            break;  
        //十六面體,預設半徑1.0  
        case DODECAHEDRON:  
            glScalef(6.0f,6.0f,6.0f);//x,y,z軸均放大6倍  
            if(bWire){  
                glutWireDodecahedron();  
            }  
            else{  
                glutSolidDodecahedron();  
            }  
            break;  
        //茶壺  
        case TEAPOT:  
            if(bWire){  
                glutWireTeapot(8.0f);  
            }  
            else{  
                glutSolidTeapot(8.0f);  
            }  
            break;  
        //八面體,預設半徑1.0  
        case OCTAHEDRON:  
            glScalef(6.0f,6.0f,6.0f);//x,y,z軸均放大6倍  
            if(bWire){  
                glutWireOctahedron();  
            }  
            else{  
                glutSolidOctahedron();  
            }  
            break;  
        //四面體,預設半徑1.0  
        case TETRAHEDRON:  
            glScalef(6.0f,6.0f,6.0f);//x,y,z軸均放大6倍  
            if(bWire){  
                glutWireTetrahedron();  
            }  
            else{  
                glutSolidTetrahedron();  
            }  
            break;  
        //二十面體,預設半徑1.0  
        case ICOSAHEDRON:  
            glScalef(6.0f,6.0f,6.0f);//x,y,z軸均放大6倍  
            if(bWire){  
                glutWireIcosahedron();  
            }  
            else{  
                glutSolidIcosahedron();  
            }  
            break;  
        default:  
            break;  
    }  
  
    //恢復壓入棧的Matrix  
    glPopMatrix();  
    //交換兩個緩衝區的指標  
    glutSwapBuffers();  
}  
//設定Redering State   
void setupRederingState(void){  
    //設定清理顏色為黑色  
    glClearColor(0.0f,0.0,0.0,1.0f);  
    //設定繪畫顏色為綠色  
    glColor3f(1.0f,1.0f,0.0f);  
    //使能深度測試  
    glEnable(GL_DEPTH_TEST);  
    //獲取受支援的點大小範圍  
    glGetFloatv(GL_POINT_SIZE_RANGE,sizes);  
    //獲取受支援的點大小增量  
    glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);  
    printf("point size range:%f-%f\n",sizes[0],sizes[1]);  
    printf("point step:%f\n",step);  
}  
//視窗大小變化回撥函式  
void changSize(GLint w,GLint h){  
    //橫寬比率  
    GLfloat ratio;  
    //設定座標系為x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)  
    GLfloat coordinatesize=10.0f;  
    //視窗寬高為零直接返回  
    if((w==0)||(h==0))  
        return;  
    //設定視口和視窗大小一致  
    glViewport(0,0,w,h);  
    //對投影矩陣應用隨後的矩陣操作  
    glMatrixMode(GL_PROJECTION);  
    //重置當前指定的矩陣為單位矩陣   
    glLoadIdentity();  
    ratio=(GLfloat)w/(GLfloat)h;  
    //正交投影  
    if(w<h)  
        glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);  
    else  
        glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);  
    //對模型檢視矩陣堆疊應用隨後的矩陣操作  
    glMatrixMode(GL_MODELVIEW);  
    //重置當前指定的矩陣為單位矩陣   
    glLoadIdentity();  
}  
  
//按鍵輸入處理回撥函式  
void specialKey(int key,int x,int y){  
  
    if(key==GLUT_KEY_UP){  
        xRotAngle-=5.0f;  
    }  
    else if(key==GLUT_KEY_DOWN){  
        xRotAngle+=5.0f;  
    }  
    else if(key==GLUT_KEY_LEFT){  
        yRotAngle-=5.0f;  
    }  
    else if(key==GLUT_KEY_RIGHT){  
        yRotAngle+=5.0f;  
    }  
    //重新繪製  
    glutPostRedisplay();  
}  
  
int main(int argc, char* argv[])  
{  
    int nModelMenu;  
    int nWireMenu;  
    int nMainMenu;  
    //初始化glut   
    glutInit(&argc,argv);  
    //使用雙緩衝區、深度緩衝區、模板緩衝區  
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);  
    //獲取系統的寬畫素  
    SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);  
    //獲取系統的高畫素  
    SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);  
    //建立視窗,視窗名字為OpenGL Glut Demo  
    glutCreateWindow("OpenGL Glut Demo");  
    //設定視窗大小  
    glutReshapeWindow(windowWidth,windowHeight);  
    //視窗居中顯示  
    glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);  
    //建立二級選單  
    nModelMenu=glutCreateMenu(processMenu);  
    glutAddMenuEntry("Sphere",1);  
    glutAddMenuEntry("Cone",2);  
    glutAddMenuEntry("Cube",3);  
    glutAddMenuEntry("Torus",4);  
    glutAddMenuEntry("Dodecahedron",5);  
    glutAddMenuEntry("Teapot",6);  
    glutAddMenuEntry("Octahedron",7);  
    glutAddMenuEntry("Tetrahedron",8);  
    glutAddMenuEntry("Icosahedron",9);  
    nWireMenu=glutCreateMenu(processMenu);  
    glutAddMenuEntry("Wire",10);  
    glutAddMenuEntry("Solid",11);  
    nMainMenu=glutCreateMenu(processMenu);  
    glutAddSubMenu("Model",nModelMenu);  
    glutAddSubMenu("WireOrSolid",nWireMenu);  
    //將選單榜定到滑鼠右鍵上  
    glutAttachMenu(GLUT_RIGHT_BUTTON);  
    //視窗大小變化時的處理函式  
    glutReshapeFunc(changSize);  
    //設定顯示回撥函式   
    glutDisplayFunc(renderScreen);  
    //設定按鍵輸入處理回撥函式  
    glutSpecialFunc(specialKey);  
    //設定全域性渲染引數  
    setupRederingState();  
    glutMainLoop();  
    return 0;  
} 
右鍵選擇mode檢視不同3d圖形;游標鍵調整角度;
球體;


調整角度;


甜圈;


這隻就是著名的雪山飛壺;


摺疊起程式碼來看下函式;


Glut下提供了一些現成的繪製立體的API,如glutWireSphere繪製球,glutWireCone繪製椎體,glutWireCube繪製立體,glutWireTorus繪製甜圈,glutWireTeapot繪製茶壺,glutWireOctahedron繪製八面體。
Glut提供的多面體API預設半徑是1.0f的,使用glScalef對其進行放大。

八 opengl資源連結

http://blog.csdn.net/one_in_one/article/category/960777
http://blog.csdn.net/yearafteryear/article/category/1442065
http://blog.csdn.net/Augusdi/article/category/685679
http://cuiqingcai.com/category/technique/cc