Hi,
I've tried to implement my collision detection so 'it can do wall sliding'.
From the theory I understood it shouldn't be that difficult:
- predict collision per axis
- final movement only for axis's which don't collide
Here's the code of my old routine and the new one with which I tried to implement it.
Any idea what's I'm overlooking?
OLD CODE (working fine btw )
VECTOR3 movement = VECTOR3(0.0f, 0.0f, 0.0f);
if(mInput.KeyDown(VkKeyScan('w')&0xFF)) movement.z = 1.0f; // DOWN
if(mInput.KeyDown(VkKeyScan('s')&0xFF)) movement.z = -1.0f; // DOWN
if(mInput.KeyDown(VkKeyScan('a')&0xFF)) movement.x = -1.0f; // DOWN
if(mInput.KeyDown(VkKeyScan('d')&0xFF)) movement.x = 1.0f; // DOWN
movement = mPlayer.NormalizeMovement(movement);
mSceneManager.GetCurrentD3dcamRef().Move(movement * mTimer.GetDelta());
mPlayer.SetPosition(mSceneManager.GetCurrentD3dcamRef().GetPositionV3());
mSceneManager.GetCurrentD3dsceneRef().mMeshInst[mPlayerMeshInstId].SetWorldPos(mSceneManager.GetCurrentD3dcamRef().GetPosition());
// collision with walls/ maze?
if(PlayerCollidesWall(mPlayer)) // COLLISION: move back the player
{
mSceneManager.GetCurrentD3dcamRef().SetPosition(mSceneManager.GetCurrentD3dcamRef().GetLastPosition());
mPlayer.SetPosition(mSceneManager.GetCurrentD3dcamRef().GetPositionV3());
mSceneManager.GetCurrentD3dsceneRef().mMeshInst[mPlayerMeshInstId].SetWorldPos(mSceneManager.GetCurrentD3dcamRef().GetPosition());
}
NEW ATTEMPT/ CODE (with wall sliding, not working/ same result as old code/approach):
VECTOR3 movementX = VECTOR3(0.0f, 0.0f, 0.0f);
VECTOR3 movementZ = VECTOR3(0.0f, 0.0f, 0.0f);
if(mInput.KeyDown(VkKeyScan('a')&0xFF)) movementX.x = -1.0f; // DOWN
if(mInput.KeyDown(VkKeyScan('d')&0xFF)) movementX.x = 1.0f; // DOWN
if(mInput.KeyDown(VkKeyScan('w')&0xFF)) movementZ.z = 1.0f; // DOWN
if(mInput.KeyDown(VkKeyScan('s')&0xFF)) movementZ.z = -1.0f; // DOWN
movementX = mPlayer.NormalizeMovement(movementX);
movementZ = mPlayer.NormalizeMovement(movementZ);
bool xCollision = false;
bool zCollision = false;
// MOVE CAMERA & PLAYER ON X-AXIS
mSceneManager.GetCurrentD3dcamRef().Move(movementX * mTimer.GetDelta());
mPlayer.SetPosition(mSceneManager.GetCurrentD3dcamRef().GetPositionV3());
// CHECK COLLISION X-AXIS
if(PlayerCollidesWall(mPlayer)) xCollision = true;
// UNDO MOVEMENT
mSceneManager.GetCurrentD3dcamRef().SetPosition(mSceneManager.GetCurrentD3dcamRef().GetLastPosition());
mPlayer.SetPosition(mSceneManager.GetCurrentD3dcamRef().GetPositionV3());
// MOVE CAMERA & PLAYER ON Z-AXIS
mSceneManager.GetCurrentD3dcamRef().Move(movementZ * mTimer.GetDelta());
mPlayer.SetPosition(mSceneManager.GetCurrentD3dcamRef().GetPositionV3());
// CHECK COLLISION Z-AXIS
if(PlayerCollidesWall(mPlayer)) zCollision = true;
// UNDO MOVEMENT
mSceneManager.GetCurrentD3dcamRef().SetPosition(mSceneManager.GetCurrentD3dcamRef().GetLastPosition());
mPlayer.SetPosition(mSceneManager.GetCurrentD3dcamRef().GetPositionV3());
// DETERMINE FINAL MOVEMENT & MOVE CAMERA/PLAYER/MESH
VECTOR3 finalMovement = VECTOR3(0.0f, 0.0f, 0.0f);
if(!xCollision) finalMovement.x = movementX.x;
if(!zCollision) finalMovement.z = movementZ.z;
if(!xCollision || !zCollision)
{
mSceneManager.GetCurrentD3dcamRef().Move(finalMovement * mTimer.GetDelta());
mPlayer.SetPosition(mSceneManager.GetCurrentD3dcamRef().GetPositionV3());
mSceneManager.GetCurrentD3dsceneRef().mMeshInst[mPlayerMeshInstId].SetWorldPos(mSceneManager.GetCurrentD3dcamRef().GetPosition());
}
Any help or hints is appreciated.