⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camera.cpp

📁 这是一个台球游戏的源代码
💻 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 + -