• PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 5MB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 33
    下载次数
  • 2008-07-28 17:05
    上传日期
简单的rpg游戏里面的功能都有了就是碰撞检测时间少没有做得很好
D3DITEM01.rar
  • D3DITEM
  • Debug
  • KAMEN-~1.bmp
    894.4KB
  • D3dAllheader.h
    218B
  • D3DITEM.sln
    878B
  • D3DCamera.h
    2KB
  • D3DITEM.vcproj.STU2008.student.user
    1.4KB
  • D3DITEM.vcproj.STU413.student.user
    1.4KB
  • D3DITEM.vcproj
    4.6KB
  • D3DITEM.ncb
    7.9MB
  • 小狗玩足球.bmp
    44.2KB
  • MRAMOR6X6.bmp
    1MB
  • D3DMesh.h
    752B
  • D3DITEM.suo
    47KB
  • D3DCamera.cpp
    5.1KB
  • D3DGame.h
    672B
  • D3DInitfun.h
    757B
  • D3DITEM.APS
    61KB
  • church.X
    8.9MB
  • D3DInitfun.cpp
    3.9KB
  • KAMEN320x240-bump.bmp
    894.4KB
  • D3DITEM.rc
    1.6KB
  • D3DGame.cpp
    2.9KB
  • resource.h
    450B
  • D3DStrat.cpp
    1.2KB
  • D3DITEM.vcproj.USER-E93DF13BB2.user.user
    1.4KB
  • panda.X
    109.5KB
  • Fetion.ico
    28.7KB
  • D3DMesh.cpp
    2.7KB
  • www.pudn.com.txt
    218B
内容介绍
#include"D3DCamera.h" #pragma comment(lib, "d3dx9.lib") CCamera::CCamera() :m_Eye(D3DXVECTOR3(0.0f, 0.0f, 0.0f)), m_At(D3DXVECTOR3(0.0f, 0.0f, 0.0f)), m_Up(D3DXVECTOR3(0.0f, 0.0f, 0.0f)), m_vDelta(D3DXVECTOR3(0.0f, 0.0f, 0.0f)), m_fFOV(0.0f), m_fAspect(0.0f), m_fNear(0.0f), m_fFar(0.0f), m_fCameraYawAngle(0.0f), m_fCameraPitchAngle(0.0f), m_fRotationYVelocity(0.0f), m_fRotationXVelocity(0.0f), m_fTranslationVelocity(0.0f), m_fMaxXPitch(D3DX_PI * 0.1f), m_fMinXPitch(-(D3DX_PI * 0.1f)), m_bIsRot(false) { m_LastPoint.x = 0; m_LastPoint.y = 0; } CCamera::~CCamera(){} void CCamera::InitCamera( D3DXVECTOR3 &Eye, D3DXVECTOR3 &At, D3DXVECTOR3 &Up, float FOV, float Aspect, float Near, float Far, float RotationYVelocity, float RotationXVelocity, float TranslationVelocity, float MaxXPitch, float MinXPitch) { //得到相关参数 m_Eye = Eye; m_At = At; m_Up = Up; m_fFOV = FOV; m_fAspect = Aspect; m_fNear = Near; m_fFar = Far; m_fRotationYVelocity = RotationYVelocity; m_fRotationXVelocity = RotationXVelocity; m_fTranslationVelocity = TranslationVelocity; m_fMaxXPitch = MaxXPitch; m_fMinXPitch = MinXPitch; //得到视图变换矩阵 D3DXMatrixLookAtLH(&m_ViewTransMatrix, &m_Eye, &m_At, &m_Up); //得到投影变换矩阵 D3DXMatrixPerspectiveFovLH(&m_ProjTransMatrix, m_fFOV, m_fAspect, m_fNear, m_fFar); //根据矩阵到欧拉角转换公式, 其中h、p、b分别是绕Y轴、X轴、Z轴旋转的角位移 // | cos(h)cos(b)+sin(h)sin(p)sin(b) sin(b)cos(p) -sin(h)cos(b)+cos(h)sin(p)sin(b)| //M(世界坐标系->视图坐标系) = |-cos(h)sin(b)+sin(h)sin(p)cos(b) cos(b)cos(p) sin(b)sin(h)+cos(h)sin(p)cos(b)| // | sin(h)cos(p) -sin(p) cos(h)cos(p) | //根据矩阵到欧拉角转换公式得到摄像机绕Y轴旋转的欧拉角 m_fCameraYawAngle = atan2f(((D3DXVECTOR3*)(&m_ProjTransMatrix._31))->x, ((D3DXVECTOR3*)(&m_ProjTransMatrix._31))->z); //根据矩阵到欧拉角转换公式得到摄像机绕X轴旋转的欧拉角 m_fCameraPitchAngle = asinf(-(((D3DXVECTOR3*)(&m_ProjTransMatrix._31))->y)); } const D3DXMATRIX* CCamera::GetViewTransMatrix() const { //返回当前的视图变换矩阵 return &m_ViewTransMatrix; } const D3DXMATRIX* CCamera::GetProjTransMatrix() const { //返回当前的投影变换矩阵 return &m_ProjTransMatrix; } const D3DXVECTOR3* CCamera::GetEye() const { //返回当前的摄像机位置 return &m_Eye; } void CCamera::GetKeyboardInput(float transVelocity) { //设置当前摄象机三个方向上的平移量都为0 m_vDelta = D3DXVECTOR3(0.0f, 0.0f, 0.0f); if(GetKeyState('W') & 0x8000) m_vDelta.z += m_fTranslationVelocity*transVelocity; else if(GetKeyState('S') & 0x8000) m_vDelta.z -= m_fTranslationVelocity*transVelocity; if(GetKeyState('A') & 0x8000) m_vDelta.x -= m_fTranslationVelocity*transVelocity; else if(GetKeyState('D') & 0x8000) m_vDelta.x += m_fTranslationVelocity*transVelocity; } void CCamera::Update(/*D3DXMATRIX& m_ViewTransMatrix*/) { POINT ptCurrentPos = {0, 0}; ///上次移动的位置 POINT ptDeltaPos = {0, 0}; ///偏移量 //得到当前光标位置 GetCursorPos(&ptCurrentPos); //得到当前光标位置相对于上次光标位置的X轴偏移量 ptDeltaPos.x = ptCurrentPos.x - m_LastPoint.x; //得到当前光标位置相对于上次光标位置的Y轴偏移量 ptDeltaPos.y = ptCurrentPos.y - m_LastPoint.y; //设置上次光标位置为当前光标位置 m_LastPoint = ptCurrentPos; //根据X轴偏移量得到摄像机绕Y轴旋转的欧拉角偏移量, 用结果递增欧拉角 m_fCameraYawAngle += ptDeltaPos.x * m_fRotationYVelocity; //根据Y轴偏移量得到摄像机绕X轴旋转的欧拉角偏移量, 用结果递增欧拉角, 有最大角和最小角限定 if(m_fCameraPitchAngle + ptDeltaPos.y * m_fRotationXVelocity > m_fMinXPitch && m_fCameraPitchAngle + ptDeltaPos.y * m_fRotationXVelocity < m_fMaxXPitch) m_fCameraPitchAngle += ptDeltaPos.y * m_fRotationXVelocity; //根据摄像机的欧拉角Yaw、欧拉角Pitch计算旋转矩阵, 此旋转矩阵是视图变换矩阵中旋转部分的逆矩阵 D3DXMATRIX matCameraRot; ZeroMemory(&matCameraRot, sizeof(D3DXMATRIX)); D3DXMatrixRotationYawPitchRoll(&matCameraRot, m_fCameraYawAngle, m_fCameraPitchAngle, 0.0f); //得到摄像机的本地坐标轴方向向量经过旋转后在世界坐标系中的方向 D3DXVECTOR3 vWorldY, vWorldZ; D3DXVECTOR3 vLocalY = D3DXVECTOR3(0.0f, 1.0f, 0.0f); D3DXVECTOR3 vLocalZ = D3DXVECTOR3(0.0f, 0.0f, 1.0f); D3DXVec3TransformCoord(&vWorldY, &vLocalY, &matCameraRot); D3DXVec3TransformCoord(&vWorldZ, &vLocalZ, &matCameraRot); //得到摄像机的本地坐标轴偏移量经过旋转后在世界坐标系中的偏移量 D3DXVECTOR3 vWorldDelta; D3DXVec3TransformCoord(&vWorldDelta, &m_vDelta, &matCameraRot); //得到摄象机位置 m_Eye += vWorldDelta; //得到摄象机观察点 m_At = m_Eye + vWorldZ; //更新视矩阵 D3DXMatrixLookAtLH(&m_ViewTransMatrix, &m_Eye, &m_At, &vWorldY); } //设置摄象机距阵应用 void CCamera::SetMatrix(LPDIRECT3DDEVICE9 pDevice) { //为有效的设备对象 if(pDevice) { //设置摄象机视图转化 pDevice->SetTransform(D3DTS_VIEW, &m_ViewTransMatrix); //设置摄象机投影转化 pDevice->SetTransform(D3DTS_PROJECTION, &m_ProjTransMatrix); } }
评论
    相关推荐
    • 干涉碰撞检测.zip
      该压缩包了有三个文件,分别有三个程序,其主要用于干涉碰撞检测
    • Ogre碰撞检测
      Ogre碰撞检测技术,包括AABB,球查询等等
    • OpenGL碰撞检测
      用OpenGL开放图形库写的一个碰撞检测系统,算法比较简单,比较基础,基于MFC框架的
    • AndEngine 碰撞检测
      基于Andengine游戏引擎CollisionDetection 实体碰撞检测例子
    • OgreOpcode碰撞检测
      OgreOpcode实现有关Ogre碰撞检测技术
    • 碰撞检测应用
      本位币详细阐述了与碰撞检测问题相关的高效解决方案及相应的数据结构和算法,主要包括:碰撞检测系统中的设计问题、数学和几何学入门、包围体、基本图元测试、层次包围体技术、空间划分、BSP树层次结构、凸体算法、...
    • 碰撞检测算法
      实时碰撞检测算法技术实时碰撞检测算法技术实时碰撞检测算法技术实时碰撞检测算法技术
    • 碰撞检测AABB
      利用AABB算法实现物体与物体之间的碰撞检测
    • 小球碰撞检测
      先绘制立方体,让后球体,计算机3D数学小球碰撞检测
    • AndEngine 碰撞检测
      基于Andengine游戏引擎CollisionDetection 实体碰撞检测例子 修复了原作者的错误,可以正常运行。