3D游戏从头编--第六回:摄象机

::金点时空::


第六回:摄象机

  一直以来,我都梦想着拥有一台数字摄象机(DV),但是口袋里的银子不允许。不过今天终于可以实现这个梦想了,因为这一回我们就要说怎么在D3D中实现摄象机的功能(望梅止渴也好^_^)。
  首先来看摄象机的原理,还是先看图吧:(一张图胜过千言万语)

  

  一台摄象机有以上画面中的一些属性:
  1、 观察点:摄象机摆放的位置
  2、 目标点:摄象机对着一个地方
  3、 观察范围:圆锥形状投影范围的夹角大小,单位是弧度。
  4、 可见的最近距离和最远距离:这两个距离中间的观察范围就是可见区域。
  5、 纵横比:显示时候的宽和高比例,一般为1。

  明白了摄象机的原理后,我们来看D3D中是怎么设置它的,有两个矩阵是用来设置摄象机的,一个是观察矩阵,一个是射影矩阵,程序说明一切。
  首先是设置摄象机的观察矩阵:

  m_vEyePt = D3DXVECTOR3( 0.0f, 3.0f,-5.0f ); // 视点坐标
  m_vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f ); // 目标点坐标
  m_vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); // 当前世界的向上方向,通常是(0,1,0)

  // 根据上面给出的3个值建立一个基于左手坐标系的观察矩阵
  D3DXMatrixLookAtLH( &m_matView, &m_vEyePt, &m_vLookatPt, &m_vUpVec );

  // 设置该矩阵为D3D的当前观察矩阵
  pd3dDevice->SetTransform( D3DTS_VIEW, &m_matView );

  然后设置摄象机的射影矩阵:

  m_fFOV = D3DX_PI/4; // 观察范围夹角,这里是90度
  m_fAspect = 1.0f; // 纵横比为1
  m_fNearPlane = 1.0f; // 可见的最近距离
  m_fFarPlane = 10000.0f; // 可见的最远距离

  // 建立一个基于左手坐标系的射影矩阵
  D3DXMatrixPerspectiveFovLH( &m_matProj, fFOV, fAspect, fNearPlane, fFarPlane );

  // 设置该矩阵为D3D的当前射影矩阵
  pd3dDevice->SetTransform( D3DTS_PROJECTION, &m_matProj );

  非常容易不是吗?不过真正的要搞懂这些还是必须先把矩阵搞懂,做3D游戏用的最多的数学知识恐怕就是矩阵了,所以建议大家不要着急写程序,先把《线形代数》的教科书找出来好好复习一下吧。
  如果你不相信,请看这回例子程序中附带的摄象机的旋转和移动部分,只要你能全部看懂,那我就不多说什么了,因为那完全都是在跟矩阵运算打交道的。
  顺便说明一下这回的例子程序,里面摄象机的部分我用一个类cCamera封装起来了,用起来肯定会比自己设置矩阵方便的多,试试在运行的时候按方向键吧,如果是第一次你会很有成就感的哦^_^
  不明白的地方欢迎大家来"金点时空"的留言板探讨。
  今天晚上一直停电,到快12点电才来,现在已经是凌晨1点了,明天还要上班呢,下回见。

  运行结果:

  

[下载本回完整源程序]

主页:http://www.gpgame.com
邮件:[email protected]
soft于2002-8-5凌晨1点


返回

金点时空 2000/8/5

www.gpgame.net

你可能感兴趣的:(游戏)