实现第三人称摄像机.docx
- 文档编号:2014697
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:12
- 大小:877.28KB
实现第三人称摄像机.docx
《实现第三人称摄像机.docx》由会员分享,可在线阅读,更多相关《实现第三人称摄像机.docx(12页珍藏版)》请在冰豆网上搜索。
实现第三人称摄像机
实现第三人称摄像机
案例说明:
本例子通过在D3D中架设一个第三人称摄像机,掌握DirectInput的使用和D3D中3维向量的计算。
打开工程后,首先修改原来FreeCamera的类设计,将private成员改成protected成员,将Input修改成虚函数,加入Move和Rote两个成员函数
在FreeCamera.cpp文件中实现Move和Rote函数
D3DXVECTOR3FreeCamera:
:
Move()
{
D3DXVECTOR3moveVec(0.0f,0.0f,0.0f);
if(g_pInput->IsKeyDown(DIK_UP)||g_pInput->IsKeyDown(DIK_W))
{
//计算摄像机方向的向量
D3DXVECTOR3vec=m_vViewAt-m_vPos;
//转换成单位向量
D3DXVec3Normalize(&vec,&vec);
//向量缩小倍
vec=vec*0.01f;
//移动摄像机
moveVec+=vec;
}
if(g_pInput->IsKeyDown(DIK_DOWN)||g_pInput->IsKeyDown(DIK_S))
{
D3DXVECTOR3vec=m_vViewAt-m_vPos;
D3DXVec3Normalize(&vec,&vec);
vec=vec*0.01f;
moveVec-=vec;
}
if(g_pInput->IsKeyDown(DIK_LEFT)||g_pInput->IsKeyDown(DIK_A))
{
D3DXVECTOR3vec=m_vViewAt-m_vPos;
D3DXVec3Normalize(&vec,&vec);
D3DXVECTOR3fvec;
//使用叉积计算垂直于摄像机方向的向量
D3DXVec3Cross(&fvec,&vec,&m_vUp);
fvec=fvec*0.01f;
moveVec+=fvec;
}
if(g_pInput->IsKeyDown(DIK_RIGHT)||g_pInput->IsKeyDown(DIK_D))
{
D3DXVECTOR3vec=m_vViewAt-m_vPos;
D3DXVec3Normalize(&vec,&vec);
D3DXVECTOR3fvec;
D3DXVec3Cross(&fvec,&vec,&m_vUp);
fvec=fvec*0.01f;
moveVec-=fvec;
}
returnmoveVec;
}
D3DXVECTOR3FreeCamera:
:
Rote()
{
D3DXVECTOR3vec=m_vViewAt-m_vPos;
if(g_pInput->GetRButton())
{
//获得鼠标移动的大小
intx=g_pInput->GetMoveX();
D3DXMATRIXrote,temp;
//生成沿向量tvec旋转的矩阵
D3DXMatrixRotationAxis(&rote,&m_vUp,D3DX_PI/360.0f*x);
inty=-g_pInput->GetMoveY();
D3DXVECTOR3tvec;
D3DXVec3Cross(&tvec,&vec,&m_vUp);
//生成沿向量tvec旋转的矩阵
D3DXMatrixRotationAxis(&temp,&tvec,D3DX_PI/360.0f*y);
D3DXVec3TransformCoord(&tvec,&vec,&temp);
D3DXVec3Normalize(&tvec,&tvec);
floatt=D3DXVec3Dot(&tvec,&m_vUp);
if(fabs(t)<0.9)
{
rote=rote*temp;
}
//使用矩阵旋转向量
D3DXVec3TransformCoord(&vec,&vec,&rote);
}
returnvec;
}
修改原来的Input函数如下:
在项目中新增CHero类继承FreeCamera类,类中将动态模型作为属性
在Hero.cpp文件中实现这些方法:
构造函数调用父类带参数的构造函数
InitHero函数创建动态模型对象
Input函数实现第三人称摄像机移动的算法
Render渲染模型
回到D3Dinit类中创建CHero的对象
去掉原来的摄像机和动态模型,用CHero替代
实现对象的初始化
移动摄像机并渲染模型
运行测试是否正确看到人物
将动态模型的坐标和缩放比例改成参数
使用矩阵让坐标和缩放比例生效
修改CHero的渲染函数
使用鼠标中间缩放摄像机与人物之间距离,首先在DirectInput中取得鼠标中键滚动的值
在FreeCamera类中加入缩放的函数
在cpp文件中实现函数
voidFreeCamera:
:
Scale()
{
D3DXVECTOR3vec=m_vViewAt-m_vPos;
floatlen=D3DXVec3Length(&vec);//计算向量的长度
intz=g_pInput->GetMoveZ();
if(z>0&&len>0.1f)
{
D3DXVec3Normalize(&vec,&vec);
vec=vec*0.001f*z;
//移动摄像机
m_vPos=m_vPos+vec;
}
if(z<0&&len<10.0f)
{
D3DXVec3Normalize(&vec,&vec);
vec=vec*0.001f*z;
//移动摄像机
m_vPos=m_vPos+vec;
}
}
在CHero的Input函数中调用该函数
接着实现人物的方向与摄像机方向一致,首先在CD3DSkinMesh类中加入属性保存人物初始的正方向,修改构造函数传递人物的正方向,在渲染函数中将当前摄像机的方向传递进来
修改构造函数的定义
在创建对象时指定人物的正方向
修改Render函数加入人物根据方向旋转的功能
在CHero类中调用时传入方向的参数
再来给动态模型添加多种动作之间切换的功能,先在CD3DSkinMesh中加入设置动画的函数SetAnimationName
在cpp文件中实现该函数
boolCD3DSkinMesh:
:
SetAnimationName(char*strAnimName)
{
if(!
m_pAnimController)
returnfalse;
DWORDnAnimSet;
charstrTempName[256];
nAnimSet=m_pAnimController->GetNumAnimationSets();
LPD3DXANIMATIONSETpAnimSet;
for(DWORDi=0;i { m_pAnimController->GetAnimationSet(i,&pAnimSet); strcpy(strTempName,pAnimSet->GetName()); if(strcmp(strAnimName,strTempName)==0) { m_pAnimController->SetTrackAnimationSet(0,pAnimSet); returntrue; } } returnfalse; } 回到CHero类中加入控制人物动作的功能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 第三人称 摄像机