OpenGL 摄像机类.docx
- 文档编号:30749208
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:19
- 大小:19.64KB
OpenGL 摄像机类.docx
《OpenGL 摄像机类.docx》由会员分享,可在线阅读,更多相关《OpenGL 摄像机类.docx(19页珍藏版)》请在冰豆网上搜索。
OpenGL摄像机类
OpenGL摄像机类
2009-07-1821:
26
向量类(Vector)
/*****************Vector.h********************/
#ifndefVECTOR_H
#defineVECTOR_H
classVector3
{
public:
Vector3(){x=0;y=0;z=0;}
Vector3(floatxx,floatyy,floatzz):
x(xx),y(yy),z(zz){}
Vector3(constVector3&vec)
{
x=vec.x;
y=vec.y;
z=vec.z;
}
inlinefloatlength();
Vector3normalize();
floatdotProduct(constVector3&v);
Vector3crossProduct(constVector3&v);
Vector3operator+(constVector3&v);
Vector3operator-(constVector3&v);
Vector3operator*(floatscale);
Vector3operator/(floatscale);
Vector3operator-();
floatx,y,z;
};
classVector2
{
public:
Vector2(floatxx=0,floatyy=0):
x(xx),y(yy){}
Vector2(constVector2&v){x=v.x,y=v.y;}
floatx,y;
};
#endif
/**************************Vector.cpp**************************/
#include"Vector.h"
inlinefloatVector3:
:
length()
{
returnx*x+y*y+z*z;
}
Vector3Vector3:
:
normalize()
{
floatlen=length();
if(len==0)len=1;
x/=len,y/=len,z/=len;
return*this;
}
floatVector3:
:
dotProduct(constVector3&v)
{
returnx*v.x+y*v.y+z*v.z;
}
Vector3Vector3:
:
crossProduct(constVector3&v)
{
Vector3vec;
vec.x=y*v.z-z*v.y;
vec.y=z*v.x-x*v.z;
vec.z=x*v.y-y*v.x;
returnvec;
}
Vector3Vector3:
:
operator+(constVector3&v)
{
returnVector3(x+v.x,y+v.y,z+v.z);
}
Vector3Vector3:
:
operator-(constVector3&v)
{
returnVector3(x-v.x,y-v.y,z-v.z);
}
Vector3Vector3:
:
operator*(floatscale)
{
x*=scale,y*=scale,z*=scale;
return*this;
}
Vector3Vector3:
:
operator/(floatscale)
{
if(scale!
=0)
x/=scale,y/=scale,z/=scale;
return*this;
}
Vector3Vector3:
:
operator-()
{
returnVector3(-x,-y,-z);
}
摄像机类(Camera)
/*****************************Camera.h************************/
#ifndefCAMERA_H
#defineCAMERA_H
#include"Vector.h"
#include"GLApplication.h"
classCamera
{
public:
Camera();
~Camera();
Vector3getPosition(){returnm_Position;}
Vector3getView(){returnm_View;}
Vector3getUpVector(){returnm_UpVector;}
floatgetSpeed(){returnm_Speed;}
voidsetSpeed(floatspeed){m_Speed=speed;}
voidsetCamera(
floatpositionX,floatpositionY,floatpositionZ,
floatviewX,floatviewY,floatviewZ,
floatupVectorX,floatupVectorY,floatupVectorZ);
voidrotateView(floatangle,floatX,floatY,floatZ);
voidrotateVector(Vector3&v,floatangle,floatx,floaty,floatz);
voidsetViewByMouse();
voidyawCamera(floatspeed);//左右移动摄像机
voidmoveCamera(floatspeed);//前后移动摄像机
voidsetLook();
staticCamera*GetCamera(){returnm_pCamera;}
private:
staticCamera*m_pCamera;
Vector3m_Position;
Vector3m_View;
Vector3m_UpVector;
floatm_Speed;
};
#endif
/**************************Camera.cpp******************************/
#include"Camera.h"
#include
Camera*Camera:
:
m_pCamera=NULL;
Camera:
:
Camera()
{
Vector3zero;
Vector3view=Vector3(0,0.5,1);
Vector3up=Vector3(0,1,0);
m_Position=zero;
m_View=view;
m_UpVector=up;
m_Speed=0.1f;
m_pCamera=this;
}
Camera:
:
~Camera()
{
}
voidCamera:
:
setCamera(
floatpositionX,floatpositionY,floatpositionZ,
floatviewX,floatviewY,floatviewZ,
floatupVectorX,floatupVectorY,floatupVectorZ)
{
Vector3Position=Vector3(positionX,positionY,positionZ);
Vector3View=Vector3(viewX,viewY,viewZ);
Vector3UpVector=Vector3(upVectorX,upVectorY,upVectorZ);
m_Position=Position;
m_View=View;
m_UpVector=UpVector;
}
/*
voidCamera:
:
setViewByMouse()
{
POINTmousePos;
intmidX=GetSystemMetrics(SM_CXSCREEN)>>1;
intmidY=GetSystemMetrics(SM_CYSCREEN)>>1;
floatangleX=0.0f;
floatangleY=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);
Vector3vAxis=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);
}*/
voidCamera:
:
setViewByMouse()
{
POINTmousePos;
intmidX=GetSystemMetrics(SM_CXSCREEN)>>1;
intmidY=GetSystemMetrics(SM_CYSCREEN)>>1;
floatangleY=0.0f;//摄像机左右旋转角度
floatangleZ=0.0f;//摄像机上下旋转角度
staticfloatcurrentRotX=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;
staticfloatlastRotX=0.0f;//用于保存旋转角度
lastRotX=currentRotX;
currentRotX+=angleZ;//跟踪摄像机上下旋转角度
if(currentRotX>1.0f)
{
currentRotX=1.0f;
if(lastRotX!
=1.0f)
{
//与旋转方向垂直的向量
Vector3vAxis=m_View-m_Position;
vAxis=vAxis.crossProduct(m_UpVector);
vAxis=vAxis.normalize();
rotateView(1-lastRotX,vAxis.x,vAxis.y,vAxis.z);
}
}
elseif(currentRotX<-1.0f)
{
currentRotX=-1.0f;
if(lastRotX!
=-1.0f)
{
Vector3vAxis=m_View-m_Position;
vAxis=vAxis.crossProduct(m_UpVector);
vAxis=vAxis.normalize();
rotateView(-1.0f-lastRotX,vAxis.x,vAxis.y,vAxis.z);
}
}
else
{
Vector3vAxis=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);
}
voidCamera:
:
yawCamera(floatspeed)
{
Vector3yaw;
Vector3cross=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;
}
voidCamera:
:
moveCamera(floatspeed)
{
Vector3vector=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;
}
voidCamera:
:
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);
}
voidCamera:
:
rotateView(floatangle,floatx,floaty,floatz)
{
Vector3newView;
Vector3view=m_View-m_Position;
floatcosTheta=(float)cos(angle);
floatsinTheta=(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;
}
voidCamera:
:
rotateVector(Vector3&v,floatangle,floatx,floaty,floatz)
{
Vector3newVector;
Vector3vTmp=v-m_Position;
floatcosTheta=(float)cos(angle);
floatsinTheta=(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********************/
#ifndefCAMERAROVE_H
#defineCAMERAROVE_H
#include"GLApplication.h"
#include"BMPLoader.h"
#include"Camera.h"
#include"CNFont.h"
classCameraRove:
GLApplication
{
public:
boolInit();
voidUninit();
voidUpdate(DWORDmilliseconds);
voidDraw();
boolLoadTexture();
voidUpdateCamera();
voidCaculateFrameRate();
voidPrintText();
voidSetLight();
voidDrawGrid();
voidDrawSphere();
voidDrawBox();
private:
friendclassGLApplication;
CameraRove(constchar*class_name);
CBMPLoaderm_Texture;
GLFontm_Font;
Cameram_Camera;
floatm_Fps;
};
#endif
/**********************CameraRove.cpp********************/
#include"CameraRove.h"
#include
GLApplication*GLApplication:
:
Create(constchar*class_name)
{
CameraRove*test=newCameraRove(class_name);
return(GLApplication*)test;
}
CameraRove:
:
CameraRove(constchar*class_name):
GLApplication(class_name)
{
m_Fps=0;
}
boolCameraRove:
:
LoadTexture()
{
if(!
m_Texture.loadBitmap("image.bmp"))
{
MessageBox(NULL,"装载位图文件失败!
","错误",MB_OK);
returnfalse;
}
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);
returntrue;
}
voidCameraRove:
:
SetLight()
{
GLfloatLightAmbient[]={0.5,0,5,0.5,1.0};//环境光参数
GLfloatLightDiffuse[]={1.0,1.0,1.0,1.0};//漫射光参数
GLfloatLightSpecular[]={1.0,1,0,1.0,1.0};//镜面光参数
GLfloatLightPosition[]={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*/
boolCameraRove:
:
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_PER
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 摄像机类 摄像机