- Home /
3rd Person Camera with fixed rotation
I've taken the camera script from 3d platformer tutorial and tried to make it work for what I need. As the code is right now the camera rotates with the rotation of the target, but I want it to keep looking in the same direction while keeping the target in the center of the view.
public GameObject Target;
public float Distance = 10.0f;
public float Height = 10.0f;
public float SmoothLag = 0.2f;
public float MaxSpeed = 10.0f;
private Vector3 headOffset = Vector3.zero;
private Vector3 centerOffset = Vector3.zero;
private ThirdPersonController controller;
private Vector3 velocity = Vector3.zero;
private float targetHeight = 100000.0f;
void Awake()
{
CharacterController characterController = (CharacterController)Target.collider;
if(characterController)
{
centerOffset = characterController.bounds.center - Target.transform.position;
headOffset = centerOffset;
headOffset.y = characterController.bounds.max.y - Target.transform.position.y;
}
if(Target)
{
controller = Target.GetComponent<ThirdPersonController>();
}
if(!controller)
{
Debug.Log("Please assign a target to the camera that has a Third Person Controller script component.");
}
}
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
}
void LateUpdate()
{
//transform.position = Target.transform.position + Offset;
Vector3 targetCenter = Target.transform.position;// + centerOffset;
Vector3 targetHead = new Vector3(0,0,1);//Target.transform.position;// + headOffset;
targetHeight = targetCenter.y + Height;
ApplyPositionDamping(new Vector3(targetCenter.x, targetHeight, targetCenter.z));
SetUpRotation(targetCenter, targetHead);
}
void ApplyPositionDamping(Vector3 targetCenter)
{
Vector3 position = transform.position;
Vector3 offset = position - targetCenter;
offset.y = 0;
Vector3 newTargetPos = offset.normalized * Distance + targetCenter;
Vector3 newPosition;
newPosition.x = Mathf.SmoothDamp(position.x, newTargetPos.x, ref velocity.x, SmoothLag, MaxSpeed);
newPosition.z = Mathf.SmoothDamp(position.z, newTargetPos.z, ref velocity.z, SmoothLag, MaxSpeed);
newPosition.y = Mathf.SmoothDamp(position.y, newTargetPos.y, ref velocity.y, SmoothLag, MaxSpeed);
//newPosition = AdjustLineOfSight(newPosition, targetCenter);
transform.position = newPosition;
}
void SetUpRotation(Vector3 centerPos, Vector3 headPos)
{
Vector3 cameraPos = transform.position;
Vector3 offsetToCenter = centerPos - cameraPos;
Quaternion yRotation = Quaternion.LookRotation(new Vector3(offsetToCenter.x, 0, offsetToCenter.z));
//Quaternion yRotation = Quaternion.LookRotation(new Vector3(0, 0, 0));
Vector3 relativeOffset = Vector3.forward * Distance + Vector3.down * Height;
transform.rotation = yRotation * Quaternion.LookRotation(relativeOffset);
}
Answer by syclamoth · Jan 26, 2012 at 03:14 AM
The simplest way to keep the target in the middle of the view of a camera while maintaining the same view direction is to set up something like this-
The camera must be the child of a 'camTarget' object, which you place in the same location as the character's starting position.
Then, put a simple position-copying script on the camTarget, and set the character to its 'target' value:
public Transform target;
void LateUpdate()
{
transform.position = target.position;
}
Set up like this, the camera will always point at the character from the same direction and distance, no matter which way the character is facing!
Your answer
Follow this Question
Related Questions
3rd person camera view lock 2 Answers
3rd Person Camera Geometry Navigation 1 Answer
Turning a character to match camera rotation 0 Answers
How do I rotate a character with my mouse? 1 Answer
How to make an object face the mouse in a non-2D world 1 Answer