现在的位置: 首页 > 综合 > 正文

OpenGL 摄像机类

2013年09月11日 ⁄ 综合 ⁄ 共 15331字 ⁄ 字号 评论关闭
OpenGL 摄像机类

向量类(Vector)

/*****************Vector.h********************/

#ifndef VECTOR_H
#define VECTOR_H

class Vector3
{
public:
Vector3(){x=0;y=0;z=0;}
Vector3(float xx,float yy,float zz):x(xx),y(yy),z(zz){}
Vector3(const Vector3 & vec)
{
   x=vec.x;
   y=vec.y;
   z=vec.z;
}
inline float length();
Vector3 normalize();
float dotProduct(const Vector3 & v);
Vector3 crossProduct(const Vector3 & v);

Vector3 operator +(const Vector3 & v);
Vector3 operator -(const Vector3 & v);
Vector3 operator *(float scale);
Vector3 operator /(float scale);
Vector3 operator -();

float x,y,z;
};

class Vector2
{
public:
Vector2(float xx=0,float yy=0):x(xx),y(yy){}
Vector2(const Vector2 & v){x=v.x,y=v.y;}

float x,y;
};

#endif

/**************************Vector.cpp**************************/

#include "Vector.h"

inline float Vector3::length()
{
return x*x+y*y+z*z;
}

Vector3 Vector3::normalize()
{
float len=length();
if(len==0) len=1;
x/=len,y/=len,z/=len;
return * this;
}

float Vector3::dotProduct(const Vector3 & v)
{
return x*v.x+y*v.y+z*v.z;
}

Vector3 Vector3::crossProduct(const Vector3 & v)
{
Vector3 vec;
vec.x=y*v.z-z*v.y;
vec.y=z*v.x-x*v.z;
vec.z=x*v.y-y*v.x;
return vec;
}

Vector3 Vector3::operator +(const Vector3 & v)
{
return Vector3(x+v.x,y+v.y,z+v.z);
}

Vector3 Vector3::operator -(const Vector3 & v)
{
return Vector3(x-v.x,y-v.y,z-v.z);
}

Vector3 Vector3::operator *(float scale)
{
x*=scale,y*=scale,z*=scale;
return * this;
}

Vector3 Vector3::operator /(float scale)
{
if(scale!=0)
   x/=scale,y/=scale,z/=scale;
return * this;
}

Vector3 Vector3::operator -()
{
return Vector3(-x,-y,-z);
}

摄像机类(Camera)

/*****************************Camera.h************************/

#ifndef CAMERA_H
#define CAMERA_H

#include "Vector.h"
#include "GLApplication.h"

class Camera
{
public:
Camera();
~Camera();

Vector3 getPosition(){return m_Position;}
Vector3 getView(){return m_View;}
Vector3 getUpVector(){return m_UpVector;}
float getSpeed(){return m_Speed;}

void setSpeed(float speed){m_Speed=speed;}

void setCamera(
   float positionX,float positionY,float positionZ,
   float viewX,float viewY,float viewZ,
   float upVectorX,float upVectorY,float upVectorZ);

void rotateView(float angle,float X,float Y,float Z);
void rotateVector(Vector3 & v,float angle,float x,float y,float z);
void setViewByMouse();
void yawCamera(float speed); //左右移动摄像机
void moveCamera(float speed); //前后移动摄像机
void setLook();
static Camera * GetCamera(){return m_pCamera;}
private:
static Camera * m_pCamera;
Vector3 m_Position;
Vector3 m_View;
Vector3 m_UpVector;
float m_Speed;
};

#endif

/**************************Camera.cpp******************************/

#include "Camera.h"
#include <math.h>

Camera * Camera::m_pCamera=NULL;

Camera::Camera()
{
Vector3 zero;
Vector3 view=Vector3(0,0.5,1);
Vector3 up=Vector3(0,1,0);
m_Position=zero;
m_View=view;
m_UpVector=up;
m_Speed=0.1f;
m_pCamera=this;
}

Camera::~Camera()
{
}

void Camera::setCamera(
        float positionX,float positionY,float positionZ,
        float viewX,float viewY,float viewZ,
        float upVectorX,float upVectorY,float upVectorZ)
{
Vector3 Position=Vector3(positionX,positionY,positionZ);
Vector3 View=Vector3(viewX,viewY,viewZ);
Vector3 UpVector=Vector3(upVectorX,upVectorY,upVectorZ);

m_Position=Position;
m_View=View;
m_UpVector=UpVector;
}
/*
void Camera::setViewByMouse()
{
POINT mousePos;
int midX=GetSystemMetrics(SM_CXSCREEN)>>1;
int midY=GetSystemMetrics(SM_CYSCREEN)>>1;
float angleX=0.0f;
float angleY=0.0f;
GetCursorPos(&mousePos);
if(mousePos.x==midX && mousePos.y==midY)
   return ;
SetCursorPos(midX,midY);
angleX=(float)((midX-mousePos.x))/100.0f;
angleY=(float)((midY-mousePos.y))/100.0f;
//rotateView(angleX,0,1,0);
rotateVector(m_View,angleX,m_UpVector.x,m_UpVector.y,m_UpVector.z);
//rotateView(angleY,1,0,0);
Vector3 vAxis=m_View-m_Position;
vAxis.crossProduct(m_UpVector);
rotateVector(m_UpVector,angleY,vAxis.x,vAxis.y,vAxis.z);
rotateView(angleY,vAxis.x,vAxis.y,vAxis.z);
}*/

void Camera::setViewByMouse()
{
POINT mousePos;
int midX=GetSystemMetrics(SM_CXSCREEN)>>1;
int midY=GetSystemMetrics(SM_CYSCREEN)>>1;
float angleY=0.0f; //摄像机左右旋转角度
float angleZ=0.0f; //摄像机上下旋转角度
static float currentRotX=0.0f;

GetCursorPos(&mousePos);
//ShowCursor(TRUE);
if(mousePos.x==midX && mousePos.y==midY)
   return ;

SetCursorPos(midX,midY);
angleY=(float)((midX-mousePos.x))/100.0f;
angleZ=(float)((midY-mousePos.y))/100.0f;
static float lastRotX=0.0f; //用于保存旋转角度
lastRotX=currentRotX;

currentRotX+=angleZ; //跟踪摄像机上下旋转角度
if(currentRotX>1.0f)
{
   currentRotX=1.0f;
   if(lastRotX!=1.0f)
   {
    //与旋转方向垂直的向量
    Vector3 vAxis=m_View-m_Position;
    vAxis=vAxis.crossProduct(m_UpVector);
    vAxis=vAxis.normalize();
    rotateView(1-lastRotX,vAxis.x,vAxis.y,vAxis.z);
   }
}
else if(currentRotX<-1.0f)
{
   currentRotX=-1.0f;
   if(lastRotX!=-1.0f)
   {
    Vector3 vAxis=m_View-m_Position;
    vAxis=vAxis.crossProduct(m_UpVector);
    vAxis=vAxis.normalize();
    rotateView(-1.0f-lastRotX,vAxis.x,vAxis.y,vAxis.z);
   }
}
else
{
   Vector3 vAxis=m_View-m_Position;
   vAxis=vAxis.crossProduct(m_UpVector);
   vAxis=vAxis.normalize();
   rotateView(angleZ,vAxis.x,vAxis.y,vAxis.z);
}
rotateView(angleY,0,1,0);
}

void Camera::yawCamera(float speed)
{
Vector3 yaw;
Vector3 cross=m_View-m_Position;
cross=cross.crossProduct(m_UpVector);
yaw=cross.normalize();
m_Position.x+=yaw.x*speed;
m_Position.z+=yaw.z*speed;

m_View.x+=yaw.x*speed;
m_View.z+=yaw.z*speed;
}

void Camera::moveCamera(float speed)
{
Vector3 vector=m_View-m_Position;
vector=vector.normalize();

m_Position.x+=vector.x*speed;
m_Position.z+=vector.z*speed;
m_Position.y+=vector.y*speed;

m_View.x+=vector.x*speed;
m_View.y+=vector.y*speed;
m_View.z+=vector.z*speed;
}

void Camera::setLook()
{
gluLookAt(
   m_Position.x,m_Position.y,m_Position.z,
   m_View.x,m_View.y,m_View.z,
   m_UpVector.x,m_UpVector.y,m_UpVector.z);
}

void Camera::rotateView(float angle,float x,float y,float z)
{
Vector3 newView;
Vector3 view=m_View-m_Position;

float cosTheta=(float)cos(angle);
float sinTheta=(float)sin(angle);

//旋转向量的X值
newView.x=(cosTheta+(1-cosTheta)*x*x)*view.x;
newView.x+=((1-cosTheta)*x*y-z*sinTheta)*view.y;
newView.x+=((1-cosTheta)*x*z+y*sinTheta)*view.z;

//旋转向量的Y值
newView.y=((1-cosTheta)*x*y+z*sinTheta)*view.x;
newView.y+=(cosTheta+(1-cosTheta)*y*y)*view.y;
newView.y+=((1-cosTheta)*y*z-x*sinTheta)*view.z;

//旋转向量的Z值
newView.z=((1-cosTheta)*x*z-y*sinTheta)*view.x;
newView.z+=((1-cosTheta)*y*z+x*sinTheta)*view.y;
newView.z+=(cosTheta+(1-cosTheta)*z*z)*view.z;

m_View=m_Position+newView;
}

void Camera::rotateVector(Vector3 & v,float angle,float x,float y,float z)
{
Vector3 newVector;
Vector3 vTmp=v-m_Position;

float cosTheta=(float)cos(angle);
float sinTheta=(float)sin(angle);

//旋转向量的X值
newVector.x=(cosTheta+(1-cosTheta)*x*x)*vTmp.x;
newVector.x+=((1-cosTheta)*x*y-z*sinTheta)*vTmp.y;
newVector.x+=((1-cosTheta)*x*z+y*sinTheta)*vTmp.z;

//旋转向量的Y值
newVector.y=((1-cosTheta)*x*y+z*sinTheta)*vTmp.x;
newVector.y+=(cosTheta+(1-cosTheta)*y*y)*vTmp.y;
newVector.y+=((1-cosTheta)*y*z-x*sinTheta)*vTmp.z;

//旋转向量的Z值
newVector.z=((1-cosTheta)*x*z-y*sinTheta)*vTmp.x;
newVector.z+=((1-cosTheta)*y*z+x*sinTheta)*vTmp.y;
newVector.z+=(cosTheta+(1-cosTheta)*z*z)*vTmp.z;

v=m_Position+newVector;
}

摄像机漫游类(CameraRove)

/***************************CameraRove.h********************/

#ifndef CAMERAROVE_H
#define CAMERAROVE_H

#include "GLApplication.h"
#include "BMPLoader.h"
#include "Camera.h"
#include "CNFont.h"

class CameraRove : GLApplication
{
public:
bool Init();
void Uninit();
void Update(DWORD milliseconds);
void Draw();

bool LoadTexture();
void UpdateCamera();
void CaculateFrameRate();
void PrintText();

void SetLight();
void DrawGrid();
void DrawSphere();
void DrawBox();

private:
friend class GLApplication;
CameraRove(const char * class_name);

CBMPLoader m_Texture;
GLFont m_Font;
Camera m_Camera;
float m_Fps;
};

#endif

/**********************CameraRove.cpp********************/

#include "CameraRove.h"         
#include <stdio.h>

GLApplication * GLApplication::Create(const char * class_name)
{
CameraRove * test=new CameraRove(class_name);
return (GLApplication *)test;
}

CameraRove::CameraRove(const char * class_name) : GLApplication(class_name)
{
m_Fps=0;
}

bool CameraRove::LoadTexture()
{
if(! m_Texture.loadBitmap("image.bmp"))
{
   MessageBox(NULL,"装载位图文件失败!","错误",MB_OK);
   return false;
}

glGenTextures(1,&m_Texture.ID);
glBindTexture(GL_TEXTURE_2D,m_Texture.ID);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

gluBuild2DMipmaps(
   GL_TEXTURE_2D,GL_RGB,m_Texture.imageWidth,
   m_Texture.imageHeight,GL_RGB,GL_UNSIGNED_BYTE,
   m_Texture.image);

glEnable(GL_TEXTURE_2D);
return true;
}

void CameraRove::SetLight()
{
GLfloat LightAmbient[]={0.5,0,5,0.5,1.0}; //环境光参数
GLfloat LightDiffuse[]={1.0,1.0,1.0,1.0}; //漫射光参数
GLfloat LightSpecular[]={1.0,1,0,1.0,1.0}; //镜面光参数
GLfloat LightPosition[]={0.0,0.0,2.0,1.0}; //光源位置

glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient); //设置环境光
glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse); //设置漫射光
glLightfv(GL_LIGHT1,GL_SPECULAR,LightSpecular); //设置反射光
glLightfv(GL_LIGHT1,GL_POSITION,LightPosition); //设置光源位置

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);
}

/** 初始化OpenGL */
bool CameraRove::Init()         
{
/** 用户自定义的初始化过程 */
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);      
glClearDepth(1.0f);           
glDepthFunc(GL_LEQUAL);          
glEnable(GL_DEPTH_TEST);         
glShadeModel(GL_SMOOTH);         
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   
ResizeDraw(true);                              /**< 改变OpenGL窗口大小,直接调用子类的函数 */

/** 初始化字体 */
if(!m_Font.InitFont())
   MessageBox(NULL,"初始化字体失败!","错误",MB_OK);

/** 载入纹理 */
if(!LoadTexture())
   MessageBox(NULL,"载入纹理失败!","错误",MB_OK);

/** 设置摄像机 */
m_Camera.setCamera(0.0f,1.5f, 6.0f, 0.0f, 1.5f, 0.0f,0.0f, 1.0f, 0.0f);

/** 设置光源 */
SetLight();

return true;                                        /**< 成功返回 */
}

/** 用户自定义的卸载函数 */
void CameraRove::Uninit()         
{
/** 用户自定义的卸载过程 */
m_Texture.FreeImage();              /** 释放纹理图像占用的内存 */
glDeleteTextures(1, &m_Texture.ID); /**< 删除纹理对象 */

}
/** 更新摄像机 */
void CameraRove::UpdateCamera()
{
m_Camera.setViewByMouse();

/** 键盘按键响应 */
if(m_Keys.IsPressed(VK_SHIFT))                      /**< 按下SHIFT键时加速 */
{
   m_Camera.setSpeed(3.0f);
}
if(!m_Keys.IsPressed(VK_SHIFT))
{
   m_Camera.setSpeed(1.0f);
}
if(m_Keys.IsPressed(VK_UP) || m_Keys.IsPressed('W'))   /**< 向上方向键或'W'键按下 */
   m_Camera.moveCamera(m_Camera.getSpeed());          /**< 移动摄像机 */

if(m_Keys.IsPressed(VK_DOWN) || m_Keys.IsPressed('S')) /**< 向下方向键或'S'键按下 */
   m_Camera.moveCamera(-m_Camera.getSpeed());         /**< 移动摄像机 */

if(m_Keys.IsPressed(VK_LEFT) || m_Keys.IsPressed('A')) /**< 向左方向键或'A'键按下 */
   m_Camera.yawCamera(-m_Camera.getSpeed());          /**< 移动摄像机 */

if(m_Keys.IsPressed(VK_RIGHT) || m_Keys.IsPressed('D')) /**< 向右方向键或'D'键按下 */
   m_Camera.yawCamera(m_Camera.getSpeed());            /**< 移动摄像机 */

}
/** 程序更新函数 */
void CameraRove::Update(DWORD milliseconds)      
{
if (m_Keys.IsPressed(VK_ESCAPE) == true)      /**< 按ESC退出 */
{
   TerminateApplication();         
}

if (m_Keys.IsPressed(VK_F1) == true)      /**< 按F1在窗口和全屏间切换 */
{
   ToggleFullScreen();         
}

/** 更新摄像机 */
UpdateCamera();

    
}

/** 计算帧速 */
void CameraRove::CaculateFrameRate()
{
static float framesPerSecond    = 0.0f;      /**< 保存显示帧数 */
    static float lastTime    = 0.0f;      /**< 记录上次时间 */      
    float currentTime = GetTickCount() * 0.001f; /**< 获得当前时间 */    

++framesPerSecond;                           /**< 显示帧数递增1 */
    /** 如果时间差大于1.0秒 */
if( currentTime - lastTime > 1.0f )         
    {
  
     lastTime = currentTime;                   /**< 保存当前时间 */
   m_Fps = framesPerSecond;                  /**< 当前帧数传给m_Fps */
        framesPerSecond = 0;                      /**< 将帧数置零 */                   
    }
}

/** 输出文字信息 */
void CameraRove::PrintText()
{
char string[128];                               /**< 用于保存输出字符串 */
glPushAttrib(GL_CURRENT_BIT);                   /**< 保存现有颜色属性信息 */
glColor3f(0.0f,1.0f,0.0f);                      /**< 设置文字颜色 */
sprintf(string,"当前位置:X=%3.1f Y=%3.1f Speed =%3.1f ",  
       m_Camera.getView().x,-m_Camera.getView().z ,m_Camera.getSpeed()); /**< 字符串赋值 */
m_Font.PrintText(string,-5.0f,3.5f);

/** 输出帧速 */
CaculateFrameRate();                               /**< 计算帧速 */
    sprintf(string,"FPS:%3.0f",m_Fps);                 /**< 字符串赋值 */
m_Font.PrintText(string, -5.0f,3.0f);              /**< 输出字符串 */
glPopAttrib();
  
}

/** 绘制网格地面 */
void CameraRove::DrawGrid()
{
    /** 获得场景中一些状态 */
GLboolean lp,tp;
glGetBooleanv(GL_LIGHTING,&lp);
glGetBooleanv(GL_TEXTURE_2D,&tp);

/** 关闭纹理和光照 */
glDisable(GL_TEXTURE_2D);
    glDisable(GL_LIGHTING);

/** 绘制过程 */
glPushAttrib(GL_CURRENT_BIT);   /**< 保存当前属性 */
    glPushMatrix();                 /**< 压入堆栈 */
glTranslatef(0.0f,0.0f,0.0f);
glColor3f(0.0f, 0.0f, 1.0f);    /**< 设置颜色 */

/** 在X,Z平面上绘制网格 */
for(float i = -50; i <= 50; i += 1)
{
   /** 绘制线 */
   glBegin(GL_LINES);

      /** X轴方向 */
    glVertex3f(-50, 0, i);
    glVertex3f(50, 0, i);

    /** Z轴方向 */
    glVertex3f(i, 0, -50);
    glVertex3f(i, 0, 50);

   glEnd();
}
glPopMatrix();
glPopAttrib();

/** 恢复场景状态 */
if(tp)
   glEnable(GL_TEXTURE_2D);
if(lp)
      glEnable(GL_LIGHTING);
}

/** 绘制球体 */
void CameraRove::DrawSphere()
{
/** 设置材质属性 */
GLfloat mat_ambient[] = { 0.9f, 0.5f, 0.8f, 1.0f };
    GLfloat mat_diffuse[] = { 0.9f, 0.5f, 0.8f, 1.0f };
GLfloat mat_shininess[] = { 100.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
   
/** 获得纹理启用状态 */
GLboolean tp;
glGetBooleanv(GL_TEXTURE_2D,&tp);
    glDisable(GL_TEXTURE_2D);                   /**< 关闭纹理 */
   
/** 绘制过程 */
glPushMatrix();
    glTranslatef(-5.0f,2.0f,-10.0f);
    GLUquadricObj * sphere = gluNewQuadric();
    gluQuadricOrientation(sphere, GLU_OUTSIDE);
gluQuadricNormals(sphere,GLU_SMOOTH);
gluSphere(sphere,2.0,50,50);
gluDeleteQuadric(sphere);
    glPopMatrix();
   
/** 恢复状态 */
if(tp)
    glEnable(GL_TEXTURE_2D);

}

/** 绘制木箱 */
void CameraRove::DrawBox()
{
/** 设置材质属性 */
GLfloat mat_ambient[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glPushMatrix();
glTranslatef(5.0f,2.0f,-10.0f);
glScalef(2.0f,2.0f,2.0f);

/** 选择纹理 */
glBindTexture(GL_TEXTURE_2D, m_Texture.ID);

/** 开始绘制四边形 */
glBegin(GL_QUADS);            
  
     /// 前侧面
   glNormal3f( 0.0f, 0.0f, 1.0f);         /**< 指定法线指向观察者 */
   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
   glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
   glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
   glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
  
   /// 后侧面
   glNormal3f( 0.0f, 0.0f,-1.0f);         /**< 指定法线背向观察者 */
   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
   glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
   glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
   glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  
   /// 顶面
   glNormal3f( 0.0f, 1.0f, 0.0f);         /**< 指定法线向上 */
   glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
   glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
   glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
  
   /// 底面
   glNormal3f( 0.0f,-1.0f, 0.0f);         /**< 指定法线朝下 */
   glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
   glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
   glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
  
   /// 右侧面
   glNormal3f( 1.0f, 0.0f, 0.0f);         /**< 指定法线朝右 */
   glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
   glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
   glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
   glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
  
   /// 左侧面
   glNormal3f(-1.0f, 0.0f, 0.0f);         /**< 指定法线朝左 */
   glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
   glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
   glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
   glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
glPopMatrix();
}

/** 绘制函数 */
void CameraRove::Draw()           
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   
glLoadIdentity();

/** 放置摄像机 */
m_Camera.setLook();

/** 绘制过程 */
DrawGrid();
    DrawSphere();
DrawBox();

/** 输出文字信息 */
PrintText();

/** 强制执行所有的OpenGL命令 */
glFlush();          
}

抱歉!评论已关闭.