📄 camera.cpp
字号:
#include <math.h>
#include "Game.h"
#include "Camera.h"
CCamera theCamera;
extern CPoolGame theGame;
const double xmin=-2.5,
xmax=2.5,
ymin=-1.8,
ymax=1.8,
zmin=0.3,
zmax=1.8;
CCamera::CCamera(void)
{
m_x=0;
m_y=0;
m_z=0;
m_alpha = 45.0;
m_theta = 0;
m_phi = 0;
m_r = 1.0;
m_up[0] = 0.0;
m_up[1] = 0.0;
m_up[2] = 1.0;
}
void CCamera::SetParameters(double x0, double y0, double z0, double theta0, double phi0)
{
m_x=x0;
m_y=y0;
m_z=z0;
m_theta=theta0;
m_phi=phi0;
UpdateVector();
}
bool CCamera::pos_valid(void)
{
if( m_x>xmin && m_x<xmax && m_y>ymin
&& m_y<ymax && m_z>zmin && m_z<zmax)
return true;
return false;
}
void CCamera::get_lookat_from_pos(void)
{
m_lookat[0] = m_x + m_r*m_VectorPosToLook[0];
m_lookat[1] = m_y + m_r*m_VectorPosToLook[1];
m_lookat[2] = m_z + m_r*m_VectorPosToLook[2];
}
void CCamera::get_pos_from_lookat(void)
{
m_x = m_lookat[0] - m_r*m_VectorPosToLook[0];
m_y = m_lookat[1] - m_r*m_VectorPosToLook[1];
m_z = m_lookat[2] - m_r*m_VectorPosToLook[2];
}
void CCamera::step_forward(double step)
{
double x0=m_x, y0=m_y;
m_x += step*cos(m_theta*PI_DIV_180);
m_y += step*sin(m_theta*PI_DIV_180);
if( !pos_valid() )
{
m_x=x0;
m_y=y0;
}
}
void CCamera::step_backward(double step)
{
double x0=m_x, y0=m_y;
m_x -= step*cos(m_theta*PI_DIV_180);
m_y -= step*sin(m_theta*PI_DIV_180);
if(!pos_valid())
{
m_x=x0;
m_y=y0;
}
}
void CCamera::step_left(double step)
{
double x0=m_x, y0=m_y;
m_x -= step*sin(m_theta*PI_DIV_180);
m_y += step*cos(m_theta*PI_DIV_180);
if(!pos_valid())
{
m_x=x0;
m_y=y0;
}
}
void CCamera::step_right(double step)
{
double x0=m_x, y0=m_y;
m_x+=step*sin(m_theta*PI_DIV_180);
m_y-=step*cos(m_theta*PI_DIV_180);
if(!pos_valid())
{
m_x=x0;
m_y=y0;
}
}
void CCamera::step_up(double step)
{
double t=m_z;
m_z+=step;
if(!pos_valid())
m_z=t;
}
void CCamera::step_down(double step)
{
double t=m_z;
m_z-=step;
if(!pos_valid())
m_z=t;
}
void CCamera::rotate_left_right(double a)
{
m_theta += a;
if(m_theta>=360.0)
m_theta -= 360.0;
if(m_theta<0.0)
m_theta += 360.0;
UpdateVector();
}
void CCamera::look_up_down(double a)
{
double t=m_phi;
double x0=m_x,y0=m_y,z0=m_z;
m_phi-=a;
if (m_phi > 20 || m_phi < -80) m_phi=t;
if(theGame.status==GS_AIMING){
get_pos_from_lookat();
if(!pos_valid()) {
m_phi=t;
m_x=x0;
m_y=y0;
m_z=z0;
}
}
}
void CCamera::UpdateVector()
{
m_VectorPosToLook[0] = cos(m_phi*PI_DIV_180)*cos(m_theta*PI_DIV_180);
m_VectorPosToLook[1] = cos(m_phi*PI_DIV_180)*sin(m_theta*PI_DIV_180);
m_VectorPosToLook[2] = sin(m_phi*PI_DIV_180);
}
// void CCamera::look_up_down(double a)
// {
// m_phi-=a;
// if(m_phi<-180.0) m_phi += 360.0;
// if(m_phi>=180.0) m_phi -= 360.0;
// if( m_phi > 90.0 || m_phi < -90.0 )
// m_up[2] = -1.0;
// else
// m_up[2] = 1.0;
// UpdateVector();
//};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -