- Home /
Problem with First-Person-Control and Quaternion.Lerp
Hello!
I am working on a script based on the Android FirstPersonControl script. I recently added a feature that is supposed to simulate the head movement while walking sidewards. I did so using Quaternion.Lerp and it instantly did what it should: The camera is rotated around the z-axis by up to 5 degrees, depending on the position of the move joystick:
var fromRotation = cameraPivot.rotation;
var toRotation = Quaternion.Euler( 0, 0, -moveTouchPad.position.x * 5);
cameraPivot.rotation = Quaternion.Lerp(fromRotation,toRotation,Time.deltaTime * 5);
But now the look-around part of the script is somehow affected: I can't look around 360 degrees anymore but just about 170 degrees and as soon as I release the rotate touchpad the camera (or the whole player) snaps back to the start rotation that is totally fixed somehow. In my understanding the code lines above should only affect the z-rotation while all other stay untouched.
What am I doing wrong? Please help me, thx
whole update():
function Update()
{
var movement = thisTransform.TransformDirection( Vector3( moveTouchPad.position.x, 0, moveTouchPad.position.y ) );
// We only want horizontal movement
movement.y = 0;
movement.Normalize();
// Check for sprinting
if (rotateTouchPad.tapCount >= 2)
{
isSprinting = true;
}
else if (!rotateTouchPad.IsFingerDown())
{
isSprinting = false;
}
// Apply movement from move joystick
var absJoyPos = Vector2( Mathf.Abs( moveTouchPad.position.x ), Mathf.Abs( moveTouchPad.position.y ) );
if ( absJoyPos.y > absJoyPos.x )
{
if ( moveTouchPad.position.y > 0)
{
if ( isSprinting )
{
movement *= sprintSpeed;
}
else
{
movement *= forwardSpeed * absJoyPos.y;
}
}
else
{
movement *= backwardSpeed * absJoyPos.y;
}
}
else
{
movement *= sidestepSpeed * absJoyPos.x;
}
movement += Physics.gravity;
movement *= Time.deltaTime;
// Actually move the character
character.Move( movement );
// Apply rotation from rotation joystick
if ( character.isGrounded )
{
var camRotation = Vector2.zero;
if ( rotateTouchPad )
camRotation = rotateTouchPad.position;
else
{
// Use tilt instead
// print( iPhoneInput.acceleration );
var acceleration = Input.acceleration;
var absTiltX = Mathf.Abs( acceleration.x );
if ( acceleration.z < 0 && acceleration.x < 0 )
{
if ( absTiltX >= tiltPositiveYAxis )
camRotation.y = (absTiltX - tiltPositiveYAxis) / (1 - tiltPositiveYAxis);
else if ( absTiltX <= tiltNegativeYAxis )
camRotation.y = -( tiltNegativeYAxis - absTiltX) / tiltNegativeYAxis;
}
if ( Mathf.Abs( acceleration.y ) >= tiltXAxisMinimum )
camRotation.x = -(acceleration.y - tiltXAxisMinimum) / (1 - tiltXAxisMinimum);
}
camRotation.x *= rotationSpeed.x;
camRotation.y *= rotationSpeed.y;
camRotation *= Time.deltaTime;
// Rotate the character around world-y using x-axis of joystick
thisTransform.Rotate( 0, camRotation.x, 0, Space.World );
// Rotate only the camera with y-axis input
cameraPivot.Rotate( -camRotation.y, 0, 0 );
// Apply head movement while walking/sprinting
var fromRotation = cameraPivot.rotation;
var toRotation = Quaternion.Euler( 0, 0, -moveTouchPad.position.x * 5);
cameraPivot.rotation = Quaternion.Lerp(fromRotation,toRotation,Time.deltaTime * 5);
}
}
Your answer
Follow this Question
Related Questions
Transition current camera rotation to 0,0,0 1 Answer
How to synchronize both movement and rotation? 1 Answer
Smooth Camera/Object Movement 1 Answer
Movement Smoothing Script not Working 2 Answers