level 7
439702
楼主
在D3D中实现第一人称视角控制 http://game.chinaitlab.com/devdoc/28097.html
--------------------------------------------------------------------------------
这两天做了第一人称视角控制,就像quake一样用鼠标控制方向,用键盘控制左右前后。鼠标和键盘用directinput控制输入。
首先,我们可以知道d3d的view矩阵有三个组成部分,分别是三个向量:眼睛所在点、眼看着的点、向上的方向。
所以,我们首先定义三个向量:
D3DXVECTOR3 VDot,VAtPoint,VUp;
赋予初值:
VDot=D3DXVECTOR3( 2.0f, 0.0f, 2.0f );
VAtPoint=D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
VUp=D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
输入到VIEW矩阵matView:
void SetView()
{
D3DXMatrixLookAtLH( &matView,&VDot, &VAtPoint, &VUp );
}
下面就可以开始做键盘控制前进、后退、左移、右移了:我们可以看到在这些控制中,VUp向量是不可以变化的,否则就会有斜着看的效果,只要同时控制VDot和VAtPoint两点的位置就可以了。
由上图,a点就是VDot,b点就是VPoint,ac就是VUp向量。首先,我们计算前进后退:前进后退实际上就是沿着ab的方向同时移动a点和b点:
第一步,计算向量ab: D3DXVec3Subtract(&ab,&VAtPoint,&VDot);
第二步,计算移动的方向和步长: D3DXVec3Normalize(&pOut2,&ab);
pOut2.x*=u; pOut2.y*=u; pOut2.z*=u;
第三步,将移动的位置加到a和b两点中去,就可得到新的前后位置。
pOut=VDot;
D3DXVec3Add(&VDot,&pOut,&pOut2);
pOut=VAtPoint;
D3DXVec3Add(&VAtPoint,&pOut,&pOut2);//*/
SetView();
接下来,我们计算左右移动,实际上就是沿着abc面的法线n同时移动a和b点:
第一步,计算abc面的法线向量n:D3DXVec3Cross(&pOut,&ab,&ac);
其它步骤同上:
D3DXVec3Normalize(&pOut2,&pOut);
pOut2.x*=u;pOut2.y*=u;pOut2.z*=u;
pOut=VDot;
D3DXVec3Add(&VDot,&pOut,&pOut2);
pOut=VAtPoint;
D3DXVec3Add(&VAtPoint,&pOut,&pOut2);
2011年05月10日 19点05分
1
--------------------------------------------------------------------------------
这两天做了第一人称视角控制,就像quake一样用鼠标控制方向,用键盘控制左右前后。鼠标和键盘用directinput控制输入。
首先,我们可以知道d3d的view矩阵有三个组成部分,分别是三个向量:眼睛所在点、眼看着的点、向上的方向。
所以,我们首先定义三个向量:
D3DXVECTOR3 VDot,VAtPoint,VUp;
赋予初值:
VDot=D3DXVECTOR3( 2.0f, 0.0f, 2.0f );
VAtPoint=D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
VUp=D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
输入到VIEW矩阵matView:
void SetView()
{
D3DXMatrixLookAtLH( &matView,&VDot, &VAtPoint, &VUp );
}
下面就可以开始做键盘控制前进、后退、左移、右移了:我们可以看到在这些控制中,VUp向量是不可以变化的,否则就会有斜着看的效果,只要同时控制VDot和VAtPoint两点的位置就可以了。
由上图,a点就是VDot,b点就是VPoint,ac就是VUp向量。首先,我们计算前进后退:前进后退实际上就是沿着ab的方向同时移动a点和b点:
第一步,计算向量ab: D3DXVec3Subtract(&ab,&VAtPoint,&VDot);
第二步,计算移动的方向和步长: D3DXVec3Normalize(&pOut2,&ab);
pOut2.x*=u; pOut2.y*=u; pOut2.z*=u;
第三步,将移动的位置加到a和b两点中去,就可得到新的前后位置。
pOut=VDot;
D3DXVec3Add(&VDot,&pOut,&pOut2);
pOut=VAtPoint;
D3DXVec3Add(&VAtPoint,&pOut,&pOut2);//*/
SetView();
接下来,我们计算左右移动,实际上就是沿着abc面的法线n同时移动a和b点:
第一步,计算abc面的法线向量n:D3DXVec3Cross(&pOut,&ab,&ac);
其它步骤同上:
D3DXVec3Normalize(&pOut2,&pOut);
pOut2.x*=u;pOut2.y*=u;pOut2.z*=u;
pOut=VDot;
D3DXVec3Add(&VDot,&pOut,&pOut2);
pOut=VAtPoint;
D3DXVec3Add(&VAtPoint,&pOut,&pOut2);