- Home /
How to make smooth transition with Camera
Hello Devs,
Target Platform : iPad
Game Type : Top-Down view (i.e. Camera is generally angled at Quaternion.Euler(90,0,0);)
Game Mechanic : The player is falling towards the ground and the camera is following the player. When the user does not give I/P to the player the player has it's own motion. Now the contrasting difference is that, the difference in velocity on the Player is huge when compared to I/P given and I/P not given. Hence I have to make a smooth transition between the two. Primarily it should not snap.
Methodology : I have a two lines of code which is responsible for moving the camera towards the required TargetPosition (Vector3) & TargetRotation (Quaternion). I have a switch case through enumerator, where in each case I just calculate the target position and rotation. This is supplied to two common lines of code, for the camera to move towards.
Problem :
Due to the difference in velocity, I am not able to get a smooth transition between modes. I have reading thro' the Unity Documentation where it is suggested to use `Vector3.SmoothDamp` for camera. I tried using SmoothDamp but I am able to figure the right way to pass those parameters.
CODE:
void FixedUpdate ()
{
DeltaTime = Time.deltaTime;
PlayerPosition = Player.transform.position;
PlayerCurrentPosition = new Vector2(PlayerPosition.x, PlayerPosition.z);
CameraCurrentPosition = new Vector2(this.transform.position.x, this.transform.position.z);
CurrentVelocity = Player.transform.rigidbody.velocity;
if(IO.isLeafManual())
CurrentMode = CameraMode.ManualMode;
else if(CurrentMode != CameraMode.LookAt)
CurrentMode = CameraMode.AutoMode;
switch (CurrentMode)
{
case CameraMode.AutoMode :
PositionalLerpFactor = Mathf.Lerp(PositionalLerpFactor, 1, (DeltaTime * 0.5f));
RotationalLerpFactor = Mathf.Lerp(RotationalLerpFactor, 1, (DeltaTime * 10));
if(!isWithinCircle (ProhibitionRadius))
{
// TargetPosition = new Vector3(PlayerPosition.x, (PlayerPosition.y + HeightFromThePlayer), PlayerPosition.z);
TargetPosition = new Vector3(TargetPosition.x, (PlayerPosition.y + HeightFromThePlayer), TargetPosition.z);
TargetRotation = RequiredRotation();
}
else
{
TargetPosition = new Vector3(TargetPosition.x, (PlayerPosition.y + HeightFromThePlayer), TargetPosition.z);
TargetRotation = Quaternion.Euler(90, 0, 0);
}
Player.transform.renderer.material.color = Color.red;
break;
case CameraMode.ManualMode :
TargetRotation = Quaternion.Euler(90, 0, 0);
PositionalLerpFactor = Mathf.Lerp(PositionalLerpFactor, 10, (DeltaTime * 0.5f));
RotationalLerpFactor = Mathf.Lerp(RotationalLerpFactor, 1, (DeltaTime * 10));
TargetPosition = new Vector3(PlayerPosition.x, (PlayerPosition.y + HeightFromThePlayer), PlayerPosition.z);
Player.transform.renderer.material.color = Color.white;
break;
default :
CurrentMode = CameraMode.AutoMode;
break;
}
this.transform.position = Vector3.Lerp(this.transform.position, TargetPosition, (DeltaTime * PositionalLerpFactor));
//this.transform.position = Vector3.SmoothDamp(this.transform.position, TargetPosition, ref CurrentVelocity, 100, 100, DeltaTime);
// Not able to correctly coherent the game using smoothdamp from lerp
this.transform.rotation = Quaternion.Lerp(this.transform.rotation, TargetRotation, (DeltaTime * RotationalLerpFactor));
}
REQUEST :
I have continuous switching between the two modes, if I have to avoid snapping - What is the best way to deal with it?
I hope I was clear with my scenario and I have provided enough information. Please let me know, if I am missing something.
Thank you,
regards, Karsnen.
Your answer
Follow this Question
Related Questions
Smooth Follow Rotation 3 Answers
Problem with Camera Transition (First-person to third-person, with Slerp) 1 Answer
Move A Camera Between Two Points Smoothly 1 Answer
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
I am writing a camera script, but it seems not to be working. Any suggestions? 1 Answer