?? opengl.cpp
字號:
// OpenGL.cpp: implementation of the OpenGL class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "OpenGL.h"
//////////////////////////////////////////////////////////////////////
GLfloat r; //飛機盤旋角度
CString test; //場景信息
anmobj* m_anmobj;
//////////////////////////////////////////////////////////////////////
OpenGL::OpenGL()
{ hFont =CreateFont(-12,0,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"Arial");
hFont0 =CreateFont(-48,0,0,0,800,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"黑體");
m_Fram=0;//
m_Time = timeGetTime(); //
tim=0; //刷屏速度
Font=new CGLFont() ;
}
OpenGL::~OpenGL()
{ CleanUp();
}
BOOL OpenGL::SetupPixelFormat(HDC hDC0)//檢測安裝OpenGL
{ int nPixelFormat; // 象素點格式
hDC=hDC0;
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd結構的大小
1, // 版本號
PFD_DRAW_TO_WINDOW | // 支持在窗口中繪圖
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 雙緩存模式
PFD_TYPE_RGBA, // RGBA 顏色模式
16, // 24 位顏色深度
0, 0, 0, 0, 0, 0, // 忽略顏色位
0, // 沒有非透明度緩存
0, // 忽略移位位
0, // 無累加緩存
0, 0, 0, 0, // 忽略累加位
16, // 32 位深度緩存
0, // 無模板緩存
0, // 無輔助緩存
PFD_MAIN_PLANE, // 主層
0, // 保留
0, 0, 0 // 忽略層,可見性和損毀掩模
};
if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd)))
{ MessageBox(NULL,"沒找到合適的顯示模式","Error",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
SetPixelFormat(hDC,nPixelFormat,&pfd);//設置當前設備的像素點格式
hRC = wglCreateContext(hDC); //獲取渲染描述句柄
wglMakeCurrent(hDC, hRC); //激活渲染描述句柄
m_anmobj =new anmobj();
m_baiscobj=new baiscobj();
m_baiscobj->light0();
return TRUE;
}
void OpenGL::init(int Width, int Height)
{ glViewport(0,0,Width,Height); // 設置OpenGL視口大小。
glMatrixMode(GL_PROJECTION); // 設置當前矩陣為投影矩陣。
glLoadIdentity(); // 重置當前指定的矩陣為單位矩陣
gluPerspective // 設置透視圖
( 54.0f, // 透視角設置為 45 度
(GLfloat)Width/(GLfloat)Height, // 窗口的寬與高比
0.1f, // 視野透視深度:近點1.0f
3000.0f // 視野透視深度:始點0.1f遠點1000.0f
);
// 這和照象機很類似,第一個參數設置鏡頭廣角度,第二個參數是長寬比,后面是遠近剪切。
glMatrixMode(GL_MODELVIEW); // 設置當前矩陣為模型視圖矩陣
glLoadIdentity(); // 重置當前指定的矩陣為單位矩陣
//
//====================================================
}
void OpenGL::Render()//OpenGL圖形處理
{ if(m_baiscobj==NULL) return;
if(m_anmobj==NULL) return;
glClearColor(0.0f, 0.0f, 0.3f, 1.0f); // 設置刷新背景色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// 刷新背景
glLoadIdentity(); // 重置當前的模型觀察矩陣
//////////////////////////////////////////////////////////////////////////
m_baiscobj->DisplayScene(); //攝像機
m_baiscobj->CreateSkyBox(3,6,3,6); //顯示天
m_baiscobj->DrawSand(); //顯示隨機山勢
srand(100);//產生樹的固定隨機數種子
for(int i=0;i<300;i++) //樹的數量
{float x= RAND_COORD((MAP_W-1)*MAP_SCALE); //位置x
float z= RAND_COORD((MAP_W-1)*MAP_SCALE); //位置z
float size=4.0f+rand()%4; //大小2-4隨機
float h=-size/10; //深淺
int cactus=rand()%4+11; //樹形隨機4種
m_baiscobj->ShowTree(x,z,size,h,cactus); //顯示樹
}
// m_baiscobj->picter(MAP+10,0,-MAP); //組合圖形1
m_baiscobj->Scene(0,MAP+30,13.6f,-MAP-20, 0, 0,0.35f);//顯示對象
m_baiscobj->Scene(1,MAP+30,15.0f,-MAP, 70, r,0.2f); //顯示對象
m_baiscobj->Scene(2,MAP+30,12.0f,-MAP, 65,r+90,0.5f); //顯示對象
for(i=0;i<RNSHU;i++) // 循環顯示RNSHU個人物
{float y; // 根據地勢取模型應在高度
y= m_baiscobj->GetHeight(m_anmobj->man[i].qd[0],-m_anmobj->man[i].qd[1]);
m_anmobj->setman(i,y+1.4f); // 顯示人物模型
}
//////////////////////////////////////////////////////////////////////////
text();//顯示文字
SwapBuffers(hDC); // 切換緩沖區
}
void OpenGL::CleanUp()
{ delete[] m_baiscobj; //刪除baiscobj類
delete[] m_anmobj;
wglMakeCurrent(hDC, NULL); //清除OpenGL
wglDeleteContext(hRC); //清除OpenGL
}
///////////////////////////////////////////////////////////////
void OpenGL::text()//顯示文字
{ DWORD Dura =(timeGetTime()-m_Time)/1000;
if(Dura>0) tim=m_Fram/Dura;
m_Fram++;
char str[128];
sprintf(str, "刷屏: %2d 幀/秒 %s",tim,test);
Font->settext(350,550,str,hFont,1,1,1.0f);
Font->settext(419,258,"+",hFont,1,0,0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -