📄 fpvcamera.h
字号:
/////////////////////////////////////////////
// THE CAMERA CLASS
//////////////////////////////////////
#include <math.h>
#define PI_OVER_180 0.0174532925 //used convert degrees to radians
extern HWND hWnd;
class CCamera
{
public:
bool Continue;
float x;
float y;
float z;
float lookx;
float looky;
float lookz;
float slookx; //special values for strafe
float slookz;
float upx;
float upy;
float upz;
float angleY;
float angleX;
void Start(float startx ,float starty,float startz,float startlookx,float startlooky,float startlookz);
void Position();
void PositionSkyBox(); //same, but no translation
void RotateY(float angle);
void RotateX(float angle);
//void RotateZ(float angle); //TODO: implement
void Walk(float distance);
void Strafe(float distance);
void Fly(float height);
//recording functions
void StartRecord(char *filename);
void RecordFrame();
void EndRecord();
//playback
void PlayBack(char *filename);
private:
FILE *file;
unsigned int framecount;
};
/////////////////////////////////////////////////////////////////
void CCamera::Start(float startx ,float starty,float startz,float startlookx,float startlooky,float startlookz)
{
x=startx;
y=starty;
z=startz;
lookx=startlookx;
looky=startlooky;
lookz=startlookz;
Continue=false;
}
///////////////////////////////////////////////////////////
void CCamera::Position()
{
gluLookAt(x,y,z,x+lookx,y+looky,z+lookz,0,1,0);
}
////////////////////////////////////////////////////////////
void CCamera::PositionSkyBox()
{
gluLookAt(0,0,0,lookx,looky,lookz,0,1,0);
}
///////////////////////////////////////////////////////////
void CCamera::RotateY(float angle)
{
angleY+=angle;
lookx=(float)sin(angleY*PI_OVER_180);
lookz=(float)cos(angleY*PI_OVER_180);
slookx=lookx; //special values to keep strafing while looking down/up
slookz=lookz;
float Length=(float)sqrt((lookx*lookx)+(looky*looky)+(lookz*lookz)); //normalize the vector
lookx=lookx/Length;
looky=looky/Length;
lookz=lookz/Length;
}
//////////////////////////////////////////////////////////
void CCamera::RotateX(float angle)
{
angleX+=angle;
if(angleX>90)
angleX=90;
if(angleX<-90)
angleX=-90;
looky=(float)tan(angleX*PI_OVER_180);
slookx=lookx; //special values to keep strafing while looking down/up
slookz=lookz;
float Length=(float)sqrt((lookx*lookx)+(looky*looky)+(lookz*lookz)); //normalize the vector
lookx=lookx/Length;
looky=looky/Length;
lookz=lookz/Length;
}
/////////////////////////////////////////////////
void CCamera::Walk(float distance)
{
x+=lookx*distance;
y+=looky*distance;
z+=lookz*distance;
}
/////////////////////////////////////////////////////
void CCamera::Strafe(float distance)
{
x-=slookz*distance;
z+=slookx*distance;
}
////////////////////////////////////////////////////
void CCamera::Fly(float height)
{
y+=height;
}
/////////////////////////////////////////////////
void CCamera::StartRecord(char *filename)
{
file=fopen(filename,"w"); //open, this destroys the file
framecount=0;
fputc(0,file); //reserv 4 bytes for the n
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -