|
我在写DX的课程设计....
在制作一个飞行模拟游戏过程中遇到了一个过不去的问题...求大侠帮忙。
我在游戏中给每个物体都有个私有的D3DXMATRIX变量
用来记录物体的位置,方向。
同时还有两个D3DXVECTOR3变量一个记录位置,一个记录方向。
当我用摄像机跟踪物体的时候。
摄像机根本不跟着走,控制起来是乱的。
我用了两种方法都不行。
以下是我的部分代码:
方法一:
void CCamera::Transform()
{
D3DXMATRIX V;
D3DXVECTOR3 pos, up, target;
pFollowedObject->GetPosition(&pos); //pFollowedObject是背跟踪物体的指针,GetPosition得到位置。
target.x = pos.x + 20;
target.y = pos.y + 20;
target.z = pos.z + 20;
up.x = up.z = 0;
up.y = 1;
D3DXMatrixLookAtLH(&V, &pos, &target, &up);
d3dDevice->SetTransform(D3DTS_VIEW, &V);
}
方法二:
void CCamera::Transform()
{
D3DXMATRIX V;
pFollowedObject->GetMatrix(&V); //GetMatrix是得到背跟踪物体的WorldMatrix
d3dDevice->SetTransform(D3DTS_VIEW, &V);
}
//这是我写的物体的移动函数 _wm就是WorldMatrix
void CMyObject::MoveX(float units)
{
D3DXMATRIX T;
D3DXMatrixTranslation(&T, units, 0, 0);
_pos.x += units;
_wm = T * _wm;
}
void CMyObject::MoveY(float units)
{
D3DXMATRIX T;
D3DXMatrixTranslation(&T, 0, units, 0);
_pos.y += units;
_wm = T * _wm;
}
void CMyObject::MoveZ(float units)
{
D3DXMATRIX T;
D3DXMatrixTranslation(&T, 0, 0, units);
_pos.z += units;
_wm = T * _wm;
}
void CMyObject::RollX(float angle)
{
D3DXMATRIX T;
D3DXMatrixRotationX(&T, angle);
_wm = T * _wm;
}
void CMyObject::RollY(float angle)
{
D3DXMATRIX T;
D3DXMatrixRotationY(&T, angle);
_wm = T * _wm;
}
void CMyObject::RollZ(float angle)
{
D3DXMATRIX T;
D3DXMatrixRotationZ(&T, angle);
_wm = T * _wm;
}
//这是网格的显示函数
void CMeshThing: isplay()
{
if (bInit)
{
d3dDevice->SetTransform(D3DTS_WORLD, &_wm);
for(int i = 0; i < Mtrls.size(); i++)
{
d3dDevice->SetMaterial( &Mtrls );
d3dDevice->SetTexture(0, Textures);
Mesh->DrawSubset(i);
}
}
}
//这是控制和绘画函数 a是被跟踪物体,一架飞机。
BOOL CEngine::Display(float timeDelta)
{
//Play things
if(d3dDevice)
{
if( ::GetAsyncKeyState('W') & 0x8000f )
a.MoveZ(-10.0f * timeDelta);
if( ::GetAsyncKeyState('S') & 0x8000f )
a.MoveZ(10.0f * timeDelta);
if( ::GetAsyncKeyState('A') & 0x8000f )
a.MoveX(-10.0f * timeDelta);
if( ::GetAsyncKeyState('D') & 0x8000f )
a.MoveX(10.0f * timeDelta);
if( ::GetAsyncKeyState('R') & 0x8000f )
a.MoveY(10.0f * timeDelta);
if( ::GetAsyncKeyState('F') & 0x8000f )
a.MoveY(-10.0f * timeDelta);
if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
a.RollX(1.0f * timeDelta);
if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
a.RollX(-1.0f * timeDelta);
if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
a.RollY(-1.0f * timeDelta);
if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
a.RollY(1.0f * timeDelta);
if( ::GetAsyncKeyState('N') & 0x8000f )
a.RollZ(1.0f * timeDelta);
if( ::GetAsyncKeyState('M') & 0x8000f )
a.RollZ(-1.0f * timeDelta);
mainCamera.Transform();
d3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xfff33fff, 1.0f, 0);
d3dDevice->BeginScene();
a.Display();
D3DXMATRIX I;
D3DXMatrixIdentity(&I);
t->draw(&I, false);
FPS->Render(0xffffffff, timeDelta);
d3dDevice->EndScene();
// Swap the back and front buffers.
d3dDevice-> resent(0, 0, 0, 0);
}
return TRUE;
}
就连用摄像机始终对准物体都不行,物体还是会跑出视线,摄像机虽然跟着在动,但移动位置不对。
我对准函数如下:
void CCamera::Transform()
{
D3DXMATRIX V;
D3DXVECTOR3 pos, up, target;
pFollowedObject->GetPosition(&target);
pos.x = pos.y = pos. z = 10;
up.x = up.z = 0;
up.y = 1;
D3DXMatrixLookAtLH(&V, &pos, &target, &up);
d3dDevice->SetTransform(D3DTS_VIEW, &V);
}
之前的两个方法我在调试过程中,监视了摄像机的位置与物体的位置,数据是一样的。
运行后飞机能动,但是飞机动起来方向等都和摄像机的移动方向不一致,摄像机根本没有跟着被跟踪物体。
求解求解... |
|