|
|
一,建立库模块GameLib :
1, 建立图形封装类 CGraph
2, 定义类的对外接口
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//初始化GRAPH
bool CGraph::Init(HDC hDC)
{
if(!hDC)
return false;
m_hDC = hDC;
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 双缓存模式
PFD_TYPE_RGBA, // RGBA 颜色模式
24, // 颜色深度
0, 0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0, 0, 0, 0, // 忽略累加位
32, // 深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 // 忽略层,可见性和损毁掩模
};
// 为设备描述表得到最匹配的像素格式
int nResult = ChoosePixelFormat(m_hDC,&pfd);
if(nResult == 0)
return false;
// 设置最匹配的像素格式为当前的像素格式
if(!SetPixelFormat(m_hDC, nResult, &pfd))
{
return false;
}
// 创建渲染描述表
m_hGLRC = wglCreateContext(m_hDC);
if(m_hGLRC == NULL)
return false;
// 使绘图描述表为当前调用现程的当前绘图描述表
if(!wglMakeCurrent(m_hDC, m_hGLRC))
return false;
return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
设置 摄象机位置:
void CGraph: ook()
{
gluLookAt(0,0,-2,0,0,0,0,1,0);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
图形绘制开始与完成。
void CGraph::Begin()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
void CGraph::End()
{
glFlush();
SwapBuffers(m_hDC);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
旋转与缩放
void CGraph::Rotatef(float fX, float fY, float fZ)
{
glRotatef(fX,1.0,0.0,0.0);
glRotatef(fY,0.0,1.0,0.0);
glRotatef(fZ,0.0,0.0,1.0);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
设置视口位置
void CGraph::SetViewPort(int nWidth, int nHeight)
{
// 设置视口变换
glViewport(0, 0, nWidth, nHeight);
// 设置透视变换
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(m_fFov, (GLdouble)nWidth/(GLdouble)nHeight, m_fNear, m_fFar);
glMatrixMode(GL_MODELVIEW);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
绘制 BOX 和 坐标轴 (实现看代码)
void DrawColorBox();
void DrawAxis();
///////////////////////////////////////////////////////////////////////////////////////////////////////////
二,打建MFC框架:
1,建立单文档工程 OGLFrm:
COGLFrmView中加: CGraph m_objGraph;
2,在 COGLFrmView::OnCreate 中
初始化 GRAPH : m_objGraph.Init(GetDC()->GetSafeHdc());
启动OGL时钟: SetTimer(1, 30, NULL)。
3, COGLFrmView 中加 函数 RenderScene()。
void COGLFrmView::RenderScene()
{
m_objGraph.Begin();
////////////////////////////////
m_objGraph.Look();
//旋转,缩放---BEGIN
static float s_fScale=0;
s_fScale += 0.005;
if(s_fScale > 1.0)
s_fScale = 0.005;
static float s_fRotate = 0;
s_fRotate += 1.0;
if (s_fRotate > 360.0)
s_fRotate -= 360.0;
//绘制轴
m_objGraph.Rotatef(0, s_fRotate, 0);
m_objGraph.DrawAxis();
m_objGraph.Rotatef(s_fRotate,s_fRotate,s_fRotate);
m_objGraph.Scalef(s_fScale, s_fScale, s_fScale);
//旋转,缩放---END
//绘制实体
m_objGraph.DrawColorBox();
m_objGraph.End();
}
4, OnTimer中调用RenderScene()以渲染场景。
void COGLFrmView::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1) //OGL时钟
{
RenderScene();
}
CView::OnTimer(nIDEvent);
}
|
|