A component that controls a chase camera for a Rigidbody player. It updates camera position each frame to follow the body, applies mouse-look offsets, allows zooming with mouse wheel, and orients the camera to look at the player.
using Sandbox;
using static Sandbox.ModelPhysics;
public sealed class CameraController : Component
{
[Property] CameraComponent main_camera;
[Property] Rigidbody body;
[Property] int DistanceToPlayer = 2000;
Vector3 currPos;
Vector3 oldPos;
Vector3 ToPlayer;
protected override void OnUpdate()
{
Angles mouseMove = Input.AnalogLook;
currPos = body.WorldPosition;
if ( Input.MouseWheel.y < 0 ) { DistanceToPlayer += 50; }
if ( Input.MouseWheel.y > 0 ) { DistanceToPlayer -= 50; }
main_camera.WorldPosition += currPos - oldPos;
ToPlayer = body.WorldPosition - main_camera.WorldPosition;
main_camera.WorldPosition += (main_camera.WorldRotation.Right * (mouseMove.yaw * 10)) + (main_camera.WorldRotation.Up * (mouseMove.pitch * 10));
if ( !ToPlayer.Length.AlmostEqual(DistanceToPlayer, 1f) )
{
main_camera.WorldPosition = body.WorldPosition - ToPlayer.Normal * DistanceToPlayer;
}
oldPos = currPos;
main_camera.WorldRotation = Rotation.LookAt( body.WorldPosition - main_camera.WorldPosition, Vector3.Up );
if ( main_camera.WorldRotation.Angles().pitch > 90 && main_camera.WorldRotation.Angles().pitch < -90 )
{
Log.Info( main_camera.WorldRotation.Angles().pitch );
}
}
}