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

📄 ccamera.cpp

📁 俄罗斯方块3D 程序+源码俄罗斯方块3D(程序+源码
💻 CPP
字号:
#include <d3dx9math.h>
#include "CCamera.h"
#include "3dhelp.h"

CCamera::CCamera( float x, float y, float z )
{
	pos = D3DXVECTOR3( x, y, z );
	right = D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
	up = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
	look = D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
}

CCamera::~CCamera()
{

}

/////////////////////////////////////////////////////////////////////
//计算视图矩阵
/////////////////////////////////////////////////////////////////////
void CCamera::GetViewMatirx( D3DXMATRIX &v )
{
	D3DXVec3Normalize( &look, &look );
	D3DXVec3Cross( &up, &look, &right );
	D3DXVec3Normalize( &up, &up );

	D3DXVec3Cross( &right, &up, &look );
	D3DXVec3Normalize( &right, &right );

	float x, y, z;

	x = -D3DXVec3Dot( &right, &pos );
	y = -D3DXVec3Dot( &up, &pos );
	z = -D3DXVec3Dot( &look, &pos );

	v( 0, 0 ) = right.x; v( 0, 1 ) = up.x; v( 0, 2 ) = look.x; v( 0, 3 ) = 0.0f;
	v( 1, 0 ) = right.y; v( 1, 1 ) = up.y; v( 1, 2 ) = look.y; v( 1, 3 ) = 0.0f;
	v( 2, 0 ) = right.z; v( 2, 1 ) = up.z; v( 2, 2 ) = look.z; v( 2, 3 ) = 0.0f;
	v( 3, 0 ) = x;		 v( 3, 1 ) = y;    v( 3, 2 ) = z;      v( 3, 3 ) = 1.0f;
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::strafe( float n )
{
	pos += right * n;
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::fly( float n )
{
	pos += up * n;
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::walk( float n )
{
	pos += look * n;
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::pitch( float angle )
{
	D3DXMATRIX m;
	D3DXMatrixRotationAxis( &m, &right, angle );
	D3DXVec3TransformCoord( &up, &up, &m );
	D3DXVec3TransformCoord( &look, &look, &m );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::yaw( float angle )
{
	D3DXMATRIX m;
	D3DXMatrixRotationAxis( &m, &up, angle );
	D3DXVec3TransformCoord( &right, &right, &m );
	D3DXVec3TransformCoord( &look, &look, &m );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::roll( float angle )
{
	D3DXMATRIX m;
	D3DXMatrixRotationAxis( &m, &look, angle );
	D3DXVec3TransformCoord( &up, &up, &m );
	D3DXVec3TransformCoord( &right, &right, &m );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::RotationU(float angle)
{
	D3DXMATRIX m;
	D3DXMatrixRotationAxis( &m, &up, angle );
	D3DXVec3TransformCoord( &pos, &pos, &m );
	D3DXVec3TransformNormal( &right, &right, &m );
	D3DXVec3TransformNormal( &look, &look, &m );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::RotationR(float angle)
{
	D3DXMATRIX m;
	D3DXMatrixRotationAxis( &m, &right, angle );
	D3DXVec3TransformCoord( &pos, &pos, &m );
	D3DXVec3TransformNormal( &up, &up, &m );
	D3DXVec3TransformNormal( &look, &look, &m );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::ResetPos( float x, float y, float z )
{
	pos = D3DXVECTOR3( x, y, z );
	right = D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
	up = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
	look = D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::Slope45()
{
	ResetPos( 0.0f, 0.0f, -6.0f );
	RotationU( AngleToRadian( 45.0f ) );
	RotationR( AngleToRadian( 45.0f ) );
	//RotationU( -45.0f );
	//RotationR( 45.0f );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::LookAtX( float f )
{
	ResetPos( 0.0f, 0.0f, f );
	RotationU( AngleToRadian( -90.0f ) );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::LookAtY( float f )
{
	ResetPos( 0.0f, 0.0f, f );
	RotationR( AngleToRadian( 90.0f ) );
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::LookAtZ( float f )
{
	ResetPos( 0.0f, 0.0f, f );
	
}

/////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////
void CCamera::RotationY(float angle)
{
	D3DXMATRIX m;
	D3DXMatrixRotationY( &m, angle );
	D3DXVec3TransformCoord( &pos, &pos, &m );
	D3DXVec3TransformCoord( &up, &up, &m );
	D3DXVec3TransformCoord( &right, &right, &m );
	D3DXVec3TransformCoord( &look, &look, &m );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -