Jump to content
  • Advertisement
Sign in to follow this  
Slyfox

Camera Collision Detection

This topic is 3790 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I've just started adding collision detection to my engine using sphere to sphere to begin with and I've managed to get it working without a problem. However the problem I am having is I don't know what to do to the camera when it does collide with something. Here is the code that deals with the movement of the camera Movement:
	if(input->keyDown(DIK_W))
	{
		D3DXVECTOR3 newMove =  D3DXVECTOR3 ( -(cos(heading)), 0.0f, (sin(heading)) );
		D3DXVec3Add(&moveDir, &moveDir, &newMove);

	}

Camera controls:
// Normalize the vector so that it's unit length
	D3DXVec3Normalize(&moveDir, &moveDir);

	// Scale the movement vector so that it's working off the player's speed
	D3DXVec3Scale(&moveDir, &moveDir, playerSpeed);

	if (cameraCollision == true)
	{
		//moveDir.x = (-moveDir.x);
		//moveDir.z = (-moveDir.y);
		//moveDir.y = (-moveDir.z);
		moveDir = D3DXVECTOR3(0.0f,0.0f,0.0f);
	}

	// Add the movement vector to the current position
	D3DXVec3Add(&position, &position, &moveDir);

	D3DXVECTOR3 lookAtPos;

	// This combines the position and the lookAt position, so that the lookAt is relative to the camera position
	D3DXVec3Add(&lookAtPos, &position, &lookAt);

	camera->setPosition(position);
	camera->setLookAt(lookAtPos);
		
		// Mouse movement
{
    // (PI / 180.0f) converts from degrees to radians
    heading += (input->getMouseMovingX() * (D3DX_PI / 180.0f)/2);
	elevation += (input->getMouseMovingY() * (D3DX_PI / 180.0f)/2);

	// Eliminate gimble lock
	if (elevation < 0.5f)
		elevation = 0.5f;
	else if (elevation > 2.5f)
		elevation = 2.5f;
    
    // Construct the lookAt vector from the heading angle
    lookAt.x = -((sin(elevation))* (cos(heading)));
	lookAt.z = (sin(elevation))* (sin(heading));
    lookAt.y = cos(elevation);



    // update the lookAt position because the player may not be moving at the moment
    
    D3DXVec3Add(&lookAtPos, &position, &lookAt);
    camera->setLookAt(lookAtPos);

As you can see from the following code, I have tried inverting the movement vector, which just gave strange behaviour. At the moment as soon as the camera collides with something it's movement vector is locked to 0,0,0 so you basically just get stuck. How can I make it so that if the camera is moving does and collide with something, it can still move in all the directions excluding the direction that is blocked? Cheers!
	if (cameraCollision == true)
	{
		//moveDir.x = (-moveDir.x);
		//moveDir.z = (-moveDir.y);
		//moveDir.y = (-moveDir.z);
		moveDir = D3DXVECTOR3(0.0f,0.0f,0.0f);
	}

[Edited by - Slyfox on March 3, 2008 11:59:35 AM]

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!