x


Shaking camera

Here is the basic idea:

  • In a top down view I want the camera to follow the player.
  • The mouse controls the rotation of the player (AngryBots movement style)
  • WASD to move (again, like AngryBots)

I want the camera to slightly move towards the direction the player is pointing at. I came up with an offset camera routine to smooth the transition but my camera won't stop shaking.

Here is the code for the camera:

public class PlayerCamera : MonoBehaviour {

public Transform testOffsetTarget;

public static PlayerCamera instance;
public Transform targetLookAt;

private Vector3 cameraOffSetVector = Vector3.zero;
private Vector3 desiredOffset = Vector3.zero;
private Vector3 desiredPosition = Vector3.zero;
private Vector3 position = Vector3.zero;

private float posX;
private float posY;
private float posZ;

private float velX;
private float velY;
private float velZ;

private float smoothVel = 0.05F;
private float offsetVel = 0.05F;


void LateUpdate () {       
    if(targetLookAt == null)
       return;
    HandlePlayerInput();     
    CalculateDesiredPosition();       
    UpdatePosition();
    CalculateDesiredOffset();
    OffsetCamera();
}

void UpdatePosition()
{      
    posX = Mathf.SmoothDamp(transform.position.x, desiredPosition.x, ref velX, smoothVel);
    posY = Mathf.SmoothDamp(transform.position.y, desiredPosition.y, ref velY, smoothVel);
    posZ = Mathf.SmoothDamp(transform.position.z, desiredPosition.z, ref velZ, smoothVel);

    position = new Vector3(posX, posY, posZ);

    transform.position = position;     
}

void HandlePlayerInput()
{
    var radius = 5.0F;

    Vector3 diff = PlayerController.instance.targetPoint - transform.position;

    float distance = diff.magnitude;

    if(distance > radius)
    {       
       cameraOffSetVector = transform.position + (diff / distance) * radius;        
    }
}

void CalculateDesiredPosition()
{     
    desiredPosition = CalculatePosition(targetLookAt.position.x, targetLookAt.position.y, targetLookAt.position.z);          
}

void OffsetCamera()
{
    posX = Mathf.SmoothDamp(position.x, desiredOffset.x, ref velX, offsetVel);
    posY = Mathf.SmoothDamp(position.y, desiredOffset.y, ref velY, offsetVel);
    posZ = Mathf.SmoothDamp(position.z, desiredOffset.z, ref velZ, offsetVel);

    position = new Vector3(posX, posY, posZ);

    transform.position = position;
    Debug.Log(transform.position);
}

void CalculateDesiredOffset()
{     
    desiredOffset = CalculatePosition(cameraOffSetVector.x, targetLookAt.position.y, cameraOffSetVector.z);          
}

Vector3 CalculatePosition(float x, float y, float z)
{
    Vector3 direction = new Vector3(x, transform.position.y, z);
    return direction;
}

}

I appreciate any feedback

more ▼

asked Dec 03 '11 at 11:19 PM

arojassa gravatar image

arojassa
1 1 1 1

(comments are locked)
10|3000 characters needed characters left

0 answers: sort voted first
Be the first one to answer this question
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x3327
x2994
x15

asked: Dec 03 '11 at 11:19 PM

Seen: 535 times

Last Updated: Dec 03 '11 at 11:19 PM