清华大学directx游戏编程第章(全章).pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
清华大学directx游戏编程第章(全章)

第13章 构建一个灵活的摄像机类 在本章将展示如何实现一个摄像机类,相对于直接用D3DXMatrixLookAtLH函数来说,它能更好地对摄像机进行控制,这个摄像机类适用于飞行模拟游戏及第一人称视角的游戏。 主要目标: 学习构建一个灵活的摄像机类,能用于飞行模拟游戏及第一人称视角的游戏。 13.1 设计摄像机 如图13.1中所示,我们用4个摄像机向量:right、up、look和position来定义摄像机在世界坐标系中的位置和方位。 通过描述摄像机的这4个向量,摄像机能完成下面6个操作: 绕right向量旋转(俯仰,pitch)。 绕up向量旋转(偏转,yaw)。 绕look向量旋转(翻滚,roll)。 沿着right向量左右平移。 沿着up向量上下移动。 沿着look向量前后移动。 13.1 设计摄像机 下面Camera类的声明反映了上面所说的摄像机的数据和想要实现的方法: 参见教材P196 目前Camera类能实现两种摄像机模式:LANDOBJECT模式和AIRCRAFT模式。 AIRCRAFT模式允许在空间中自由地移动摄像机,也就是说能进行6个方向的移动;然而,在一些游戏中,比如第一人称视角射击游戏,玩家控制的主角是无法飞翔的,所以必须限制特定的轴上的移动,LANDOBJECT模式就可以实现这种限制,在下一节中就能看到具体的实现细节。 13.2 摄像机类的实现细节 13.2.1 计算视图矩阵 在图13.2中,从世界坐标系变换到视图坐标系。摄像机的位置位于世界坐标系的原点,并望向Z轴的负方向。注意世界空间中的所有物体的位置也会随着摄像机的变化而变化,这样才能让摄像机对世界的观察与转换前保持一致。 13.2.1 计算视图矩阵 我们把计算这个所需矩阵的工作分两步进行: 1. 第一步:平移 2. 第二步:旋转 3. 以上两个步骤的综合 Camera::getViewMatrix方法就是用于计算这个矩阵的,其代码如下: 参见教材P199 每次调用这个函数的时候,就需要重新根据look向量计算up和right向量以确保它们的正交性。通过look向量与right向量的叉乘来计算出新的正交向量up,然后再通过up向量和look向量的叉乘来计算出新的正交向量right。 13.2.2 绕任意轴的旋转 摄像机类必须要实现绕任意轴的旋转,如图13.3所示。D3DX库提供的下列函数可以完成这项功能: D3DXMATRIX* D3DXMatrixRotationAxis( D3DXMATRIX *pOut, // 返回旋转矩阵 CONST D3DXVECTOR3 *pV, // 旋转轴 FLOAT Angle // 旋转角度,以弧度为单位 ); 13.2.3 俯仰、偏转和翻滚 图13.4~13.6,分别描述了摄像机俯仰、偏转和翻滚的情况。 13.2.3 俯仰、偏转和翻滚 当摄像机进行俯仰操作时,是把up和look向量绕right向量旋转一定的角度。同样的,进行偏转操作时,是把right和look向量绕up向量旋转一定的角度。而翻滚则是把right和up向量绕look向量旋转一定的角度。 俯仰、偏转和翻滚方法的具体实现如下: 参见教材P202 13.2.4 行走、平移和飞行 行走,指的是摄像机沿所看的方向移动(也就是沿着look向量移动)。平移,指的是面向所看的方向左右移动,也就是沿right向量移动。最后,飞行指的是沿up向量移动。 如果需要沿这几个轴移动,只需要在摄像机的位置向量上加上一个与移动方向相同的向量(见图13.7)。 13.2.4 行走、平移和飞行 例如,LANDOBJECT不能在弹跳的时候飞起来、不能在仰视前进和身子翻滚平移的时候飞离地面。所以,必须把移动范围限制到XZ平面内。然而,考虑到在LANDOBJECT模式下的摄像机也已经能随着地形的高度改变自身的位置,如上楼梯或爬山,所以提供了Camera::setPosition方法,使用户可以手动调整摄像机所处的高度和位置。 行走、平移和飞行方法的实现如下: 参见教材P203 13.3 示例:摄像机 本章的示例程序创建和渲染了如图13.8所示的一个场景。通过键盘的输入可以自由地在场景里穿梭。具体的按键作用如下: W/S ——前进/后退。 A/D——向左平移/向右平移。 R/F——向上/向下飞行。 Up/Down arrow keys——俯仰。 Left/Right arrow keys——偏转。 N/M——翻滚。 13.3 示例:摄像机 Display函数的定义如下: 参见教材P205 一开始,传入一个合法的IDirect3DDevice9指针来建立整个场景,因此,建议在Setup函数内调用这个函数。 如果要清除整个场景,那么在Cleanu

文档评论(0)

celkhn0303 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档