- Home /
Rotate Camera in Increments with Damping
I want to rotate my camera around my character in 45 degree increments, but I don't want it to pop, I want some damping. However, I'm not quite sure how to do this. Right now the camera is parented under a pivot object and I rotate the pivot.
function Update() {
if (Input.GetKeyDown("o")) {
transform.RotateAround(piviot.position, Vector3.up, 45);
}
if (Input.GetKeyDown("p")) {
transform.RotateAround(piviot.position, Vector3.up, -45);
}
}
My questions is: How would I apply damping to the rotation of the pivot. Right now if I try to apply any damping it gets cut short because because it's only running the rotation in a single frame. I don't mind if the player has to wait a second or so for the camera to rotate around before they can rotate it again. I would just like to remove the popping.
Answer by Seth-Bergman · Jul 21, 2012 at 07:26 PM
Cool, so not a total loss..
I actually used that example to get something that seems to work, tho still maybe not perfect, this is tested working at least:
var target : Vector3;
var dir = 1;
function Start () {
}
function Update () {
if (Input.GetButtonDown("Fire1"))
dir -=1;
if (Input.GetButtonDown("Fire2"))
dir +=1;
if(dir < 1)
dir = 8;
if(dir > 8)
dir = 1;
if (dir == 1)
target = new Vector3(0f, 0f, 1f);
else if (dir == 2)
target = new Vector3(1f, 0f, 1f);
else if (dir == 3)
target = new Vector3(1f, 0f, 0f);
else if (dir == 4)
target = new Vector3(1f, 0f, -1f);
else if (dir == 5)
target = new Vector3(0f, 0f, -1f);
else if (dir == 6)
target = new Vector3(-1f, 0f, -1f);
else if (dir == 7)
target = new Vector3(-1f, 0f, 0f);
else if (dir == 8)
target = new Vector3(-1f, 0f, 1f);
transform.forward = Vector3.Lerp(transform.forward,target,Time.deltaTime);
}
this would be attached to the pivot itself
This is great, I guess the slightly more complicated method can sometimes be the best! I can edit slightly from here and it's perfect. :D
Answer by Seth-Bergman · Jul 21, 2012 at 09:53 AM
var rotateRight = false;
var rotateLeft = false;
var currentRotation : float;
var targetRotation : float;
var canRotate = true;
var rotateSpeed = 45;
function Update() {
currentRotation = transform.rotation.y;
if(canRotate)
{
if (Input.GetKeyDown("o")) {
rotateRight = true;
targetRotation = currentRotation + 45;
canRotate = false;
}
if (Input.GetKeyDown("p")) {
rotateLeft = true;
targetRotation = currentRotation - 45;
canRotate = false;
}
}
if(rotateRight)
{
if(currentRotation < targetRotation)
transform.RotateAround(piviot.position, Vector3.up, rotateSpeed * time.deltaTime);
else
{
rotateRight = false;
canRotate = true;
}
}
if(rotateLeft)
{
if(currentRotation > targetRotation)
transform.RotateAround(piviot.position, Vector3.up, -rotateSpeed * time.deltaTime);
else
{
rotateLeft = false;
canRotate = true;
}
}
untested, but try this, if you like...
Had to update it with pivot.rotation.eulerAngles.y as I was getting normalized numbers. Thus when added 45 could never possibly reach it.
After the fix it's near perfect. The only problem I'm having now is that fact it sometimes calculates values higher than 360 for targetRotation so I clamped it between 0 and 360. Now the problem is the value never hits 0 or 360 due to Time.deltaTime.
Any idea how to prevent it from this over shot and continuous rotation loop?
sorry, not a very good solution.. here's a better one:
http://answers.unity3d.com/questions/33380/rotate-to-facing-direction.html
hmm, but on second thought that will snap too.. never$$anonymous$$d..
Your link inadvertently sent me to the solution of a different problem. Well done!
Your answer
Follow this Question
Related Questions
Quaternion Slerp Sanity Check 1 Answer
Gameobject Rotation Calculation 0 Answers
damping the camera with mouse orbit script 0 Answers
Transition current camera rotation to 0,0,0 1 Answer
Rotation always changing values! 1 Answer