- Home /
Question by
FlippingFlopper · Sep 23, 2019 at 04:39 PM ·
camerarotationquaternionrelative
made a camera relative movement, but it works weird when player rotates.
Hi. I made a player movement which is relative to camera. player moves with leftJoystick, and rotates with rightJoystick.
it works fine, until i make a rotation of player using rightJoystick.
after player rotates, the movementVector directs to weird way. It is hard to understand this situation, because movementVector variable doesn't get any information about player's rotation. is there any error on my code that can lead camera-relative movement to be wrong after player rotates??
private void FixedUpdate() {
float leftHorizontalAbs = Mathf.Abs(leftJoystick.Horizontal);
float leftVerticalAbs = Mathf.Abs(leftJoystick.Vertical);
float rightHorizontalAbs = Mathf.Abs(rightJoystick.Horizontal);
float rightVerticalAbs = Mathf.Abs(rightJoystick.Vertical);
Vector3 cameraRotation = cameraTransform.rotation.eulerAngles;
cameraRotation.x = 0;
cameraRotation.z = 0;
#region movement
if (leftHorizontalAbs > leftJoystick.DeadZone || leftVerticalAbs > leftJoystick.DeadZone) {
// joystick axis to vector3.
Vector3 movementVector = new Vector3(leftJoystick.Horizontal, 0f, leftJoystick.Vertical);
// set vector3 to camera relative.
movementVector = cameraTransform.TransformDirection(movementVector);
// Sync Y axis with player Y axis.
movementVector.y = 0f;
// take move.
transform.Translate(movementVector.normalized * Time.fixedDeltaTime * currentSpeed);
}
#endregion movement
#region rotation
if (rightHorizontalAbs > leftJoystick.DeadZone || rightVerticalAbs > leftJoystick.DeadZone) {
Vector3 rightJoystickRotation = Quaternion.FromToRotation(new Vector3(-rightJoystick.Horizontal, 0f, rightJoystick.Vertical), Vector3.forward).eulerAngles;
if (rotationLerpSpeed == 0f) {
transform.rotation = Quaternion.Euler(rightJoystickRotation + cameraRotation);
} else {
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(rightJoystickRotation + cameraRotation), Time.fixedDeltaTime * rotationLerpSpeed);
}
}
#endregion rotation
}
Comment