Direct9

9开发工具是Visual Studio 2008(从2005开始C++平台下的改进都不是太大的,最新的平台是2010

1、建立非控制台的windows程序框架

   启动Visual Studio的开发环境,文件新建项目中选择

pastedGraphic.png

建立一个空项目

函数注解

AdjustWindowRectEX

  函数功能:该函数依据所需客户矩形大小,计算需要的窗口矩形的大小。计算出的窗口矩形随后可以传送给CreateWindowEx函数,用于创建一个客户区所需大小的窗口。

  函数原型:BOOL AdjustWindowRectEXLPRECT lpRectDWORD dwStyteBOOL bMenuDWORD 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)设定其值;

nVersionPIXELFORMATDESCRIPTOR结构的版本,一般设为1;

dwFlags是一组表明象素缓冲特性的标志位,如缓冲是否支持GDIOpenGL;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值