- Home /
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
Comment