- Home /
Rotate camera around player (Paranted)
I have a player object and a camera object. The camera object is positioned behind the player. My control script is attached to the player.
In the start function i set the cameras initial position right behind the player
void Start() {
// ...
CameraTransform = MainCamera.GetComponent<Transform>();
// ...
CameraTransform.position = CachedTransform.position + CachedTransform.forward * -1.0f * FollowDistance;
}
Next in my update if left or right movement is being made i have the player rotate around the camera (XOrbitSensitivity is 50):
void Update() {
//...
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) {
CachedTransform.RotateAround(CameraTransform.position, CachedTransform.up, -1.0f * XOrbitSensitivity * Time.deltaTime);
} else if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) {
CachedTransform.RotateAround(CameraTransform.position, CachedTransform.up, XOrbitSensitivity * Time.deltaTime);
}
//...
}
Works great!
then if the up or down arrows are pressed i make the player run away from or towards the camera (In the same update function):
void Update() { // ... if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) { Vector3 P = CachedTransform.position - CameraTransform.position; Vector3 Q = CachedTransform.up; Vector3 Projection = Vector3.Dot(P, Q.normalized) * Q.normalized; Vector3 Perpendicular = P - Projection; CachedTransform.forward = Perpendicular.normalized;
CharController.Move(CachedTransform.forward * RunSpeed);
} else if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) {
Vector3 P = CachedTransform.position - CameraTransform.position;
Vector3 Q = CachedTransform.up;
Vector3 Projection = (Vector3.Dot(P, Q) / Q.magnitude) * Q.normalized;
Vector3 Perpendicular = P - Projection;
CachedTransform.forward = Perpendicular.normalized;
CharController.Move(CachedTransform.forward * -1.0f * RunSpeed);
}
// ...
}
Again, this works great!
Now in my Late update (Still the same script) i position the camera 5 units behind the player, and rotate around the player
void LateUpdate() { Vector3 VectorToCamera = CameraTransform.position - CachedTransform.position; CameraTransform.position = CachedTransform.position + VectorToCamera.normalized * FollowDistance;
CameraTransform.RotateAround(CachedTransform.position, CachedTransform.up, Input.GetAxis("Mouse X") * Time.deltaTime * XOrbitSensitivity);
CameraTransform.LookAt(CachedTransform);
}
And it looks like everything works fine.
The issue is if i move the mouse to pivot the camera around the player, then run forward or back my character does not run a straight line, he takes a turn that seems to be scaled by how far i'm turned... I can orbit the player, run an orbit around the camera but after i move the mouse i can't run straight... Moving the mouse back does seem to straighten the craracter out a bit...
Can anyone help? I think the issue is with my vector projection.
Thanks
~Gabe
Your answer
Follow this Question
Related Questions
Camera Rotating Around (0, 0, 0) 2 Answers
Set Max Rotation On Weapon Sway 0 Answers
Camera Rotation Tips 1 Answer
Make camera rotate don't stop 1 Answer
How to make the camera rotate only when right click is held down on the mouse? 1 Answer