2.8 View Transformations and cCamera(摄像机)

 

2.8 View Transformations and cCamera(摄像机)

咦,估计老外也腻了,直接来个声明:

class cCamera

{

protected:

float m_XPos, m_YPos, m_ZPos; //位置坐标

float m_XRot, m_YRot, m_ZRot; // 旋转值

// 摄像机跟踪目标

float m_StartXPos, m_StartYPos, m_StartZPos;

float m_StartXRot, m_StartYRot, m_StartZRot;

float m_EndXPos, m_EndYPos, m_EndZPos;

float m_EndXRot, m_EndYRot, m_EndZRot;

D3DXMATRIX m_matWorld; // 世界转换坐标

D3DXMATRIX m_matTranslation; // 转换矩阵

D3DXMATRIX m_matRotation; // 旋转矩阵

 

public:

cCamera(); // 构造函数

D3DXMATRIX *GetMatrix(); // 获取视角转换矩阵

BOOL Update(); // 更新转换矩阵

// 移动和旋转视角

BOOL Move(float XPos, float YPos, float ZPos);

BOOL MoveRel(float XAdd, float YAdd, float ZAdd);

BOOL Rotate(float XRot, float YRot, float ZRot);

BOOL RotateRel(float XAdd, float YAdd, float ZAdd);

// 通过Eye位置和At位置定为一个摄像头

BOOL Point(float XEye, float YEye, float ZEye, /

float XAt, float YAt, float ZAt);

// 设置开始和结束跟踪目标

BOOL SetStartTrack();

BOOL SetEndTrack();

// 沿着踪迹插入摄像头

//使用 Time (0.0 - 1.0) 全部 Length.

BOOL Track(float Time, float Length);

//获取转换和旋转值

float GetXPos();

float GetYPos();

float GetZPos();

float GetXRotation();

float GetYRotation();

float GetZRotation();

};

 

cCamera类和cWorldPosition类很像,所以我将放弃介绍。不同的是:Point,SetStartTrack,SetEndTrack,Track函数。你可以使用Point函数去定位一个视点并可以指定一个观察方向。

 

这三个track得的相关函数可以通过实践跟踪一个移动的摄像头。要使用摄像头跟踪目标,定为他的开始位置并调用cCamera::SetStartTrack。然后移动摄像头到结束位置并调用cCamera::SetEndTrack

现在,调用cCamera::Track去沿着你创建的轨迹定位摄像头有一个问题(调用之前要先cCamera::Update),TrackTime参数范围在0.0(开始目标)到1.0(结束目标)和任何在摄像头沿着track.Length步数之间和任意你想运行的主观值(比如毫秒);

 

摄像头跟踪可以创建一些非常棒的效果,看例子:


 

// 定位到 0.0f, 100.0f, -100.0f 并朝原点看

Cam.Point(0.0f, 100.0f, -100.0f, 0.0f, 0.0f, 0.0f);

Cam.SetStartTrack();

// 移动到结束目标

Cam.Point(-100.0f, 0.0f, 0.0f, 0.0f, 100.0f, 0.0f);

Cam.SetEndTrack();

// Position camera to halfway mark over 10000 milliseconds

// 定位摄像头到中间标记大于10000毫秒

Cam.Track(0.5f, 10000);

Cam.Update();

 

要设置摄像头到当前视角矩阵,使用cGraphics::SetCamera函数:

g_Graphics.SetCamera(&Cam); // 之前不要调用Update函数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值