9开发工具是Visual Studio 2008(从2005开始C++平台下的改进都不是太大的,最新的平台是2010)
1、建立非控制台的windows程序框架
启动Visual Studio的开发环境,文件—新建—项目中选择
建立一个空项目
函数注解
AdjustWindowRectEX
函数功能:该函数依据所需客户矩形大小,计算需要的窗口矩形的大小。计算出的窗口矩形随后可以传送给CreateWindowEx函数,用于创建一个客户区所需大小的窗口。
函数原型:BOOL AdjustWindowRectEX(LPRECT lpRect,DWORD dwStyte;BOOL bMenu;DWORD dwExStyle);
参数:
lpRect:指向RECT结构的指针,该结构包含所需客户区域的左上角和右下角的坐标。函数返回时,该结构包含容纳所需客户区域的窗口的左上角和右下角的坐标。
dwStyle:指定将被计算尺寸的窗口的窗口风格。
bMenu:指示窗口是否有菜单。
dwExStyle:指定将被计算尺寸的窗口的扩展窗口风格。
返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。
HMODULE GetModuleHandle (
LPCTSTR lpModuleName);
功能说明
获取一个应用程序或动态链接库的模块句柄
参数说明
lpModuleName 模块名称
返回值
如执行成功成功,则返回模块句柄。零表示失败。通过GetLastError获得错误信息
如:
GetModuleHandle(NULL);
这将返回自身应用程序句柄
PIXELFORMATDESCRIPTOR
像素格式明确了OpenGL绘制平面的特性,如象素缓冲区是单缓冲还是双缓冲,数据是 RGBA方式还是Color Index方式等。每个OpenGL显示设备一般用名为PIXELFORMATDESCRIPTOR的结构来表示某个的像素格式,这个结构包含26个属性信息。Win32定义PIXELFORMATDESCRIPTOR如下所示:
typedef struct tagPIXELFORMATDESCRIPTOR
{ // pfd
WORD nSize;
WORD nVersion;
DWORD dwFlags;
BYTE iPixelType;
BYTE cColorBits;
BYTE cRedBits;
BYTE cRedShift;
BYTE cGreenBits;
BYTE cGreenShift;
BYTE cBlueBits;
BYTE cBlueShift;
BYTE cAlphaBits;
BYTE cAlphaShift;
BYTE cAccumBits;
BYTE cAccumRedBits;
BYTE cAccumGreenBits;
BYTE cAccumBlueBits;
BYTE cAccumAlphaBits;
BYTE cDepthBits;
BYTE cStencilBits;
BYTE cAuxBuffers;
BYTE iLayerType;
BYTE bReserved;
DWORD dwLayerMask;
DWORD dwVisibleMask;
DWORD dwDamageMask;
} PIXELFORMATDESCRIPTOR;
nSize是象素格式描述子结构的大小,sizeof(PIXELFORMATDESCRIPTOR)设定其值;
nVersion是PIXELFORMATDESCRIPTOR结构的版本,一般设为1;
dwFlags是一组表明象素缓冲特性的标志位,如缓冲是否支持GDI或OpenGL等;
iPixelType 说明象素数据类型是RGBA还是颜色索引;
cColorBits 每个颜色缓冲区中颜色位平面的数目,对颜色索引方式是缓冲区大小;
cRedBits 每个RGBA颜色缓冲区中红色位平面的数目;
cRedShift 每个RGBA颜色缓冲区中红色位平面的偏移数;
cGreenBits 每个RGBA颜色缓冲区中绿色位平面的数目;
cGreenShift每个RGBA颜色缓冲区中绿色位平面的偏移数;
cBlueBits 每个RGBA颜色缓冲区中蓝色位平面的数目;
cBlueShift 每个RGBA颜色缓冲区中蓝色位平面的偏移数;
cAlphaBits 每个RGBA颜色缓冲区中alpha位平面的数目(保留的,现不支持);
cAlphaShift每个RGBA颜色缓冲区中alpha位平面的偏移数(保留的,现不支持);
cAccumBits 累加缓冲区中全部位平面的数目;
cAccumRedBits 累加缓冲区中红色位平面的数目;
cAccumGreenBits累加缓冲区中绿色位平面的数目;
cAccumBlueBits 累加缓冲区中蓝色位平面的数目;
cAccumAlphaBits累加缓冲区中alpha位平面的数目;
cDepthBits Z(深度)缓冲区的深度;
cStencilBits 模板缓冲区的深度;
cAuxBuffers 轴向缓冲区的数量(一般1.0版本不支持);
iLayerType 被忽略,为了一致性而包含的;
bReserved 表层和底层平面的数量::位0-3表最多15层表层平面,位4-7表底层;
dwLayerMask 被忽略,为了一致性而包含的;
dwVisibleMask 是透明色彩的值(RGBA方式)或是一个底层平面的索引(Index);
dwDamageMask被忽略,为了一致性而包含的。
OpenGL的程序框架
Day.cpp
// OpenGL的程序框架.cpp : Defines the entry point for the application./
#include "stdafx.h"
#include "OpenGL.h"
//
OpenGL* m_OpenGL;
HDC hDC; // GDI设备句柄,将窗口连接到GDI( 图形设备接口)
HGLRC hRC=NULL; // 渲染描述句柄,将OpenGL调用连接到设备描述表
HWND hWnd=NULL; // 保存Windows 分配给程序的窗口句柄
int Width = 800;// 窗口宽
int Height= 600;// 窗口高
int bits = 16; // 颜色深度
void GameLoop()
{ MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT) // 消息循环
{ fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage) //有消息
{ TranslateMessage(&msg);
DispatchMessage(&msg); }
else m_OpenGL->Render(); //无消息 }}
LRESULT WINAPI MsgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )// 消息处理
{ switch(message)
{ case WM_CREATE: // 建立窗口
hDC = GetDC(hWnd); // 获取当前窗口的设备句柄
m_OpenGL->SetupPixelFormat(hDC);// 调用显示模式安装功能
return 0; break;
case WM_CLOSE: // 关闭窗口
m_OpenGL->CleanUp(); // 结束处理
PostQuitMessage(0);
return 0; break;
case WM_SIZE: // 窗口尺寸变化
Height = HIWORD(lParam); // 窗口的高
Width = LOWORD(lParam); // 窗口的宽
if (Height==0) Height=1; // 防止被除
m_OpenGL->init(Width,Height);
return 0; break;
case WM_DESTROY: // 退出消息
PostQuitMessage(0);
return 0; break;
case WM_KEYUP: // 按ESC退出,全屏模式必需要加入的退出方式。
switch (wParam)
{ case VK_ESCAPE:
m_OpenGL->CleanUp(); // 结束处理
PostQuitMessage(0);
return 0;break; }
default: break; }
return (DefWindowProc(hWnd, message, wParam, lParam));}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT )// WinMain程序入口{ // 注册窗口类
bool fullScreen =TRUE;
DWORD dwExStyle; // Window 扩展风格
DWORD dwStyle; // Window 窗口风格
RECT windowRect; // 窗口尺寸
int nX=0,nY=0;
dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE; // 使窗口具有D外观
dwStyle=WS_OVERLAPPEDWINDOW; // 使用标准窗口
//WS_OVERLAPPEDWINDOW是有标题栏,窗口菜单,最大、小化按钮和可调整尺寸的窗口
int wid=GetSystemMetrics(SM_CXSCREEN); // 获取当前屏幕宽
int hei=GetSystemMetrics(SM_CYSCREEN); // 获取当前屏幕高
nX=(wid-Width)/2;nY=(hei-Height)/2; // 计算窗口居中用
//-------------------------------------------------------------------
AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle);
//根据窗口风格来调整窗口尺寸达到要求的大小
char cc[]="tml";
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
cc, NULL };
RegisterClassEx( &wc );
m_OpenGL=new OpenGL();//
hWnd = CreateWindowEx(NULL,cc,"学OpenGL编D游戏[ 1.OpenGL的程序框架])",dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,nX, nY,Width, Height,
NULL,NULL,hInst,NULL); // 创建窗口
ShowWindow( hWnd, SW_SHOWDEFAULT ); // 显示窗口
UpdateWindow( hWnd ); // 刷新窗口
GameLoop(); // 进入消息循环
return 0;}
opengl.h
// OpenGL.h: interface for the OpenGL class.
#if !defined(AFX_OPENGL_H__17B7289C_7956_41C5_89B9_621E3C435389__INCLUDED_)
#define AFX_OPENGL_H__17B7289C_7956_41C5_89B9_621E3C435389__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class OpenGL
{ public: OpenGL();
virtual ~OpenGL();
public:
HDC hDC; // GDI设备描述表
HGLRC hRC; // 永久着色描述表
BOOL SetupPixelFormat(HDC hDC);
void init(int Width, int Height);
void Render();
void CleanUp();};
#endif // !defined(AFX_OPENGL_H__17B7289C_7956_41C5_89B9_621E3C435389__INCLUDED_)
Opengl.cpp
// OpenGL.cpp: implementation of the OpenGL class.
// 学程序编游戏系列丛书
// 唐明理E_mail: cqtmL@163.com
#include "stdafx.h"
#include "OpenGL.h"
OpenGL::OpenGL()
{}
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); //激活渲染描述句柄
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, // 视野透视深度:近点.0f
3000.0f // 视野透视深度:始点.1f远点.0f
);
// 这和照象机很类似,第一个参数设置镜头广角度,第二个参数是长宽比,后面是远近剪切。
glMatrixMode(GL_MODELVIEW); // 设置当前矩阵为模型视图矩阵
glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵}
void OpenGL::Render()//OpenGL图形处理
{ glClearColor(0.0f, 0.0f, 0.5f, 1.0f); // 设置刷新背景色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// 刷新背景
glLoadIdentity(); // 重置当前的模型观察矩阵
glFlush(); // 更新窗口
SwapBuffers(hDC); // 切换缓冲区}
void OpenGL::CleanUp()//清除OpenGL
{ wglMakeCurrent(hDC, NULL); //清除OpenGL
wglDeleteContext(hRC); } //清除OpenGL}
opengl基本图形
winmain.cpp
#include "stdafx.h"
#include "OpenGL.h"
OpenGL* m_OpenGL;
HDC hDC; // GDI设备句柄,将窗口连接到GDI( 图形设备接口)
HGLRC hRC=NULL; // 渲染描述句柄,将OpenGL调用连接到设备描述表
HWND hWnd=NULL; // 保存Windows 分配给程序的窗口句柄
int Width = 800;// 窗口宽
int Height= 600;// 窗口高
int bits = 16; // 颜色深度
void GameLoop()
{ MSG msg;
BOOL fMessage;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
while(msg.message != WM_QUIT) // 消息循环
{ fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
if(fMessage) //有消息
{ TranslateMessage(&msg);
DispatchMessage(&msg); }
else m_OpenGL->Render(); //无消息 }}
LRESULT WINAPI MsgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam )// 消息处理
{ switch(message)
{ case WM_CREATE: // 建立窗口
hDC = GetDC(hWnd); // 获取当前窗口的设备句柄
m_OpenGL->SetupPixelFormat(hDC);// 调用显示模式安装功能
return 0; break;
case WM_CLOSE: // 关闭窗口
m_OpenGL->CleanUp(); // 结束处理
PostQuitMessage(0);
return 0; break;
case WM_SIZE: // 窗口尺寸变化
Height = HIWORD(lParam); // 窗口的高
Width = LOWORD(lParam); // 窗口的宽
if (Height==0) Height=1; // 防止被除
m_OpenGL->init(Width,Height);
return 0; break;
case WM_DESTROY: // 退出消息
PostQuitMessage(0);
return 0; break;
case WM_KEYUP: // 按ESC退出,全屏模式必需要加入的退出方式。
switch (wParam)
{ case VK_ESCAPE:
m_OpenGL->CleanUp(); // 结束处理
PostQuitMessage(0);
return 0;break; }
default: break; }
return (DefWindowProc(hWnd, message, wParam, lParam));}
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT )// WinMain程序入口
{ // 注册窗口类
bool fullScreen =TRUE;
DWORD dwExStyle; // Window 扩展风格
DWORD dwStyle; // Window 窗口风格
RECT windowRect; // 窗口尺寸
int nX=0,nY=0;
dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE; // 使窗口具有D外观
dwStyle=WS_OVERLAPPEDWINDOW; // 使用标准窗口
//WS_OVERLAPPEDWINDOW是有标题栏,窗口菜单,最大、小化按钮和可调整尺寸的窗口
int wid=GetSystemMetrics(SM_CXSCREEN);// 获取当前屏幕宽
int hei=GetSystemMetrics(SM_CYSCREEN);// 获取当前屏幕高
nX=(wid-Width)/2;nY=(hei-Height)/2;// 计算窗口居中用
AdjustWindowRectEx(&windowRect,dwStyle,FALSE,dwExStyle); //根据窗口风格来调整窗口尺寸达到要求的大小
char cc[]="tml";
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL,cc, NULL };
RegisterClassEx( &wc );
m_OpenGL=new OpenGL();//
hWnd = CreateWindowEx(NULL,cc,"学OpenGL编D游戏[ 2.OpenGL的基本图形])", dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
nX, nY,Width, Height,
NULL,NULL,hInst,NULL); // 创建窗口
ShowWindow( hWnd, SW_SHOWDEFAULT ); // 显示窗口
UpdateWindow( hWnd ); // 刷新窗口
GameLoop(); // 进入消息循环
return 0;}
Opengl.h
#if !defined(AFX_OPENGL_H__17B7289C_7956_41C5_89B9_621E3C435389__INCLUDED_)
#define AFX_OPENGL_H__17B7289C_7956_41C5_89B9_621E3C435389__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "bsipic.h"
class OpenGL
{ public: OpenGL();
virtual ~OpenGL();
public:
bsipic m_bsipic; // 定义bsipic类变量
HDC hDC; // GDI设备描述表
HGLRC hRC; // 永久着色描述表
BOOL SetupPixelFormat(HDC hDC);
void init(int Width, int Height);
void Render();
void CleanUp();
void play();
//定义了bsipic类后以下函数定义移到bsipic类的h文件中
/* void Point(); //画点
void Line(); //画线
void Triangle(); //画面
void Square(); //画正方面
void Esquare(); //画正方体
void Park(); //画园
void Pillar(); //园柱*/};
#endif // !defined(AFX_OPENGL_H__17B7289C_7956_41C5_89B9_621E3C435389__INCLUDED_)
Opengl.cpp
#include "stdafx.h"
#include "OpenGL.h"
extern HWND hWnd;
float r; //盘旋角度
OpenGL::OpenGL()
{}
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); //激活渲染描述句柄
// glPointSize(2);//定义点的大小
// glLineWidth(2);
return TRUE;}
void OpenGL::init(int Width, int Height)
{ glViewport(0,0,Width,Height); // 设置OpenGL视口大小。
glMatrixMode(GL_PROJECTION);// 设置当前矩阵为投影矩阵。
glLoadIdentity();// 重置当前指定的矩阵为单位矩阵
gluPerspective // 设置透视图
( 60.0f, // 透视角设置为45 度
(GLfloat)Width/(GLfloat)Height, // 窗口的宽与高比
0.1f, // 视野透视深度:近点.0f
3000.0f // 视野透视深度:始点.1f远点.0f
);
// 这和照象机很类似,第一个参数设置镜头广角度,第二个参数是长宽比,后面是远近剪切。
glMatrixMode(GL_MODELVIEW); // 设置当前矩阵为模型视图矩阵
glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵
//====================================================
}
void OpenGL::Render()//OpenGL图形处理
{ glClearColor(0.0f, 0.0f, 0.6f, 1.0f); // 设置刷新背景色
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// 刷新背景
glLoadIdentity(); // 重置当前的模型观察矩阵
// glColor3f(0,0,0); //黑色
/* glPushMatrix();
glTranslatef (-5, 4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
m_bsipic.Point(); //画点
glPopMatrix();
glPushMatrix();
glTranslatef ( 0, 4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
m_bsipic.Line(); //画线
glPopMatrix();
glPushMatrix();
glTranslatef ( 5, 4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
m_bsipic.Triangle(); //画面
glPopMatrix();
glPushMatrix();
glTranslatef (-5, 0,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
m_bsipic.Square(); //画正方面
glPopMatrix();
glPushMatrix();
glTranslatef ( 0, 0,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
m_bsipic.Esquare(); //画正方体
glPopMatrix();
glPushMatrix();
glTranslatef ( 5, 0,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
m_bsipic.Park(); //画园
glPopMatrix();
glPushMatrix();
glTranslatef (-5,-4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
m_bsipic.Pillar(); //园柱
glPopMatrix();
glPushMatrix();
glTranslatef ( 0, -4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
auxSolidCone(1,1); //辅助库物体实面园锥
glPopMatrix();
glPushMatrix();
glTranslatef ( 5,-4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
auxWireTeapot(1); //辅助库物体线茶壶
glPopMatrix();*/
play();
glFlush(); // 更新窗口
SwapBuffers(hDC); // 切换缓冲区
r+=1;if(r>360) r=0;
}
void OpenGL::CleanUp()
{ wglMakeCurrent(hDC, NULL); //清除OpenGL
wglDeleteContext(hRC); //清除OpenGL
}
void OpenGL::play()
{ glPushMatrix();
glPointSize(4); //点的大小
glTranslatef (-5, 4,-13);
glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(1.0f, 0.0f, 0.0f);m_bsipic.Point(); //画点
glPopMatrix();
glPushMatrix();
glTranslatef ( 0, 4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(0.0f, 1.0f, 0.0f);m_bsipic.Line(); //画线
glPopMatrix();
glPushMatrix();
glTranslatef ( 5, 4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(0.0f, 0.0f, 1.0f);m_bsipic.Triangle(); //画面
glPopMatrix();
glPushMatrix();
glTranslatef (-5, 0,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(1.0f, 1.0f, 0.0f);m_bsipic.Square(); //画正方面
glPopMatrix();
glPushMatrix();
glTranslatef ( 0, 0,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(0.0f, 1.0f, 1.0f);m_bsipic.Esquare(); //画正方体
glPopMatrix();
glPushMatrix();
glTranslatef ( 5, 0,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(1.0f, 0.0f, 1.0f);m_bsipic.Park(); //画园
glPopMatrix();
glPushMatrix();
glTranslatef (-5,-4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(1.0f, 1.0f, 1.0f);m_bsipic.Pillar(); //园柱
glPopMatrix();
glPushMatrix();
glTranslatef ( 0, -4,-13);
glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(0.7f, 0.7f, 0.7f);auxSolidCone(1,1); //辅助库物体实面园锥
glPopMatrix();
glPushMatrix();
glTranslatef ( 5,-4,-13);glRotatef(r,1.0,1.0,1.0); //整体旋转
glColor3f(0.4f, 0.4f, 0.4f);auxWireTeapot(1); //辅助库物体线茶壶
glPopMatrix();
}
//
//定义了bsipic类后以下函数定义移到bsipic类的cpp文件中
//
/*void OpenGL::Point()//画点
{ glBegin(GL_POINTS);// 单个顶点
glVertex3f( 0.0f, 1.0f,-1.0f);//a点
glVertex3f(-1.0f,-1.0f, 0.0f);//b点
glVertex3f( 1.0f,-1.0f, 0.0f);//c点
glEnd();
}
void OpenGL::Line()//画线
{ glBegin(GL_LINE_LOOP); //闭合折线
glVertex3f( 0.0f, 1.0f,-1.0f);//a点
glVertex3f(-1.0f,-1.0f, 0.0f);//b点
glVertex3f( 1.0f,-1.0f, 0.0f);//c点
glEnd();
}
void OpenGL::Triangle()//画面
{ glBegin(GL_POLYGON);//填充凸多边形
glVertex3f( 0.0f, 1.0f,-1.0f);//a点
glVertex3f(-1.0f,-1.0f, 0.0f);//b点
glVertex3f( 1.0f,-1.0f, 0.0f);//c点
glEnd();
}
void OpenGL::Square()//画正方面
{ glBegin(GL_POLYGON);//填充凸多边形
glVertex3f(0.0f,0.0f ,0.0f);//a点
glVertex3f(1.0f,0.0f, 0.0f);//b点
glVertex3f(1.0f,0.0f,-1.0f);//c点
glVertex3f(0.0f,0.0f,-1.0f);//d点
glEnd();
}
void OpenGL::Esquare()//画正方体
{ glBegin(GL_QUAD_STRIP);//填充凸多边形
glVertex3f(0.0f,0.0f ,0.0f);//a0点
glVertex3f(0.0f,1.0f ,0.0f);//a1点
glVertex3f(1.0f,0.0f, 0.0f);//b0点
glVertex3f(1.0f,1.0f, 0.0f);//b1点
glVertex3f(1.0f,0.0f,-1.0f);//c0点
glVertex3f(1.0f,1.0f,-1.0f);//c1点
glVertex3f(0.0f,0.0f,-1.0f);//d0点
glVertex3f(0.0f,1.0f,-1.0f);//d1点
glVertex3f(0.0f,0.0f ,0.0f);//a0点
glVertex3f(0.0f,1.0f ,0.0f);//a1点
glEnd();
//现在这个正方体还缺上下两个面。应该补上。
glBegin(GL_POLYGON);//填充凸多边形
glVertex3f(0.0f,0.0f ,0.0f);//a0点
glVertex3f(1.0f,0.0f, 0.0f);//b0点
glVertex3f(1.0f,0.0f,-1.0f);//c0点
glVertex3f(0.0f,0.0f,-1.0f);//d0点
glVertex3f(0.0f,1.0f ,0.0f);//a1点
glVertex3f(1.0f,1.0f, 0.0f);//b1点
glVertex3f(1.0f,1.0f,-1.0f);//c1点
glVertex3f(0.0f,1.0f,-1.0f);//d1点
glEnd();
}
void OpenGL::Park ()//画园
{ glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串
glVertex3f(0,0,0.0f );
for(int i=0;i<=390;i+=30)
{float p=(float)(i*3.14/180);
glVertex3f((float)sin(p),(float)cos(p),0.0f );// 园轨迹
}
glEnd();
}
void OpenGL::Pillar () //园柱
{glBegin(GL_QUAD_STRIP);// 连续填充四边形串
for(int i=0;i<=390;i+=30)
{ float p=(float)(i*3.14/180);
glVertex3f((float)sin(p)/2,(float)cos(p)/2,1.0f );// 前园
glVertex3f((float)sin(p)/2,(float)cos(p)/2,0.0f );// 后园
}
glEnd();
}*/
bsipic.h
#if !defined(AFX_BSIPIC_H__726BAD2E_C0FE_4F4C_8282_BD53CCED1A9D__INCLUDED_)
#define AFX_BSIPIC_H__726BAD2E_C0FE_4F4C_8282_BD53CCED1A9D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class bsipic
{
public:
bsipic();
virtual ~bsipic();
void Point(); //画点
void Line(); //画线
void Triangle(); //画面
void Square(); //画正方面
void Esquare(); //画正方体
void Park(); //画园
void Pillar(); //园柱};
#endif // !defined(AFX_BSIPIC_H__726BAD2E_C0FE_4F4C_8282_BD53CCED1A9D__INCLUDED_)
bsipic.cpp
#include "stdafx.h"
#include "bsipic.h"
bsipic::bsipic()
{}
bsipic::~bsipic()
{}
void bsipic::Point()//画点
{ glBegin(GL_POINTS);// 单个顶点
glVertex3f( 0.0f, 1.0f,-1.0f);//a点
glVertex3f(-1.0f,-1.0f, 0.0f);//b点
glVertex3f( 1.0f,-1.0f, 0.0f);//c点
glEnd();}
void bsipic::Line()//画线
{ glBegin(GL_LINE_LOOP); //闭合折线
glVertex3f( 0.0f, 1.0f,-1.0f);//a点
glVertex3f(-1.0f,-1.0f, 0.0f);//b点
glVertex3f( 1.0f,-1.0f, 0.0f);//c点
glEnd();}
void bsipic::Triangle()//画面
{ glBegin(GL_POLYGON);//填充凸多边形
glVertex3f( 0.0f, 1.0f,-1.0f);//a点
glVertex3f(-1.0f,-1.0f, 0.0f);//b点
glVertex3f( 1.0f,-1.0f, 0.0f);//c点
glEnd();}
void bsipic::Square()//画正方面
{ glBegin(GL_POLYGON);//填充凸多边形
glVertex3f(0.0f,0.0f ,0.0f);//a点
glVertex3f(1.0f,0.0f, 0.0f);//b点
glVertex3f(1.0f,0.0f,-1.0f);//c点
glVertex3f(0.0f,0.0f,-1.0f);//d点
glEnd();}
void bsipic::Esquare()//画正方体
{ glBegin(GL_QUAD_STRIP);//填充凸多边形
glVertex3f(0.0f,0.0f ,0.0f);//a0点
glVertex3f(0.0f,1.0f ,0.0f);//a1点
glVertex3f(1.0f,0.0f, 0.0f);//b0点
glVertex3f(1.0f,1.0f, 0.0f);//b1点
glVertex3f(1.0f,0.0f,-1.0f);//c0点
glVertex3f(1.0f,1.0f,-1.0f);//c1点
glVertex3f(0.0f,0.0f,-1.0f);//d0点
glVertex3f(0.0f,1.0f,-1.0f);//d1点
glVertex3f(0.0f,0.0f ,0.0f);//a0点
glVertex3f(0.0f,1.0f ,0.0f);//a1点
glEnd();
//现在这个正方体还缺上下两个面。应该补上。
glBegin(GL_POLYGON);//填充凸多边形
glVertex3f(0.0f,0.0f ,0.0f);//a0点
glVertex3f(1.0f,0.0f, 0.0f);//b0点
glVertex3f(1.0f,0.0f,-1.0f);//c0点
glVertex3f(0.0f,0.0f,-1.0f);//d0点
glVertex3f(0.0f,1.0f ,0.0f);//a1点
glVertex3f(1.0f,1.0f, 0.0f);//b1点
glVertex3f(1.0f,1.0f,-1.0f);//c1点
glVertex3f(0.0f,1.0f,-1.0f);//d1点
glEnd();}
void bsipic::Park ()//画园
{ glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串
glVertex3f(0,0,0.0f );
for(int i=0;i<=390;i+=30)
{float p=(float)(i*3.14/180);
glVertex3f((float)sin(p),(float)cos(p),0.0f );// 园轨迹 }
glEnd();}
void bsipic::Pillar () //园柱
{glBegin(GL_QUAD_STRIP);// 连续填充四边形串
for(int i=0;i<=390;i+=30)
{ float p=(float)(i*3.14/180);
glVertex3f((float)sin(p)/2,(float)cos(p)/2,1.0f );// 前园
glVertex3f((float)sin(p)/2,(float)cos(p)/2,0.0f );// 后园 }
glEnd();}