/// <summary> /// Update the X axis and calculate the heading. This can be called by a delegate /// with a custom axis. /// <param name="deltaTime">Used for damping. If less than 0, no damping is done.</param> /// <param name="up">World Up, set by the CinemachineBrain</param> /// <param name="axis"></param> /// <param name="recentering"></param> /// <param name="isLive"/>true if the vcam is live</param> /// <returns>Axis value</returns> /// </summary> public float UpdateHeading( float deltaTime, Vector3 up, ref AxisState axis, ref AxisState.Recentering recentering, bool isLive) { if (m_BindingMode == BindingMode.SimpleFollowWithWorldUp) { axis.m_MinValue = -180; axis.m_MaxValue = 180; } // Only read joystick when game is playing if (deltaTime < 0 || !VirtualCamera.PreviousStateIsValid || !isLive) { axis.Reset(); recentering.CancelRecentering(); } else if (axis.Update(deltaTime)) { recentering.CancelRecentering(); } if (m_BindingMode == BindingMode.SimpleFollowWithWorldUp) { float finalHeading = axis.Value; axis.Value = 0; return(finalHeading); } float targetHeading = GetTargetHeading(axis.Value, GetReferenceOrientation(up)); recentering.DoRecentering(ref axis, deltaTime, targetHeading); return(axis.Value); }
void SetAxesForRotation(Quaternion targetRot) { Vector3 up = VcamState.ReferenceUp; Vector3 fwd = Vector3.forward; Transform parent = VirtualCamera.transform.parent; if (parent != null) { fwd = parent.rotation * fwd; } m_HorizontalAxis.Value = 0; m_HorizontalAxis.Reset(); Vector3 targetFwd = targetRot * Vector3.forward; Vector3 a = fwd.ProjectOntoPlane(up); Vector3 b = targetFwd.ProjectOntoPlane(up); if (!a.AlmostZero() && !b.AlmostZero()) { m_HorizontalAxis.Value = Vector3.SignedAngle(a, b, up); } m_VerticalAxis.Value = 0; m_VerticalAxis.Reset(); fwd = Quaternion.AngleAxis(m_HorizontalAxis.Value, up) * fwd; Vector3 right = Vector3.Cross(up, fwd); if (!right.AlmostZero()) { m_VerticalAxis.Value = Vector3.SignedAngle(fwd, targetFwd, right); } }
/// <summary> /// Update the X axis and calculate the heading. This can be called by a delegate /// with a custom axis. /// <param name="deltaTime">Used for damping. If less than 0, no damping is done.</param> /// <param name="up">World Up, set by the CinemachineBrain</param> /// <param name="axis"></param> /// <returns>Axis value</returns> /// </summary> public float UpdateHeading(float deltaTime, Vector3 up, ref AxisState axis) { // Only read joystick when game is playing if (deltaTime < 0 || !CinemachineCore.Instance.IsLive(VirtualCamera)) { axis.Reset(); m_RecenterToTargetHeading.CancelRecentering(); } else if (axis.Update(deltaTime)) { m_RecenterToTargetHeading.CancelRecentering(); } float targetHeading = GetTargetHeading(axis.Value, GetReferenceOrientation(up), deltaTime); if (m_BindingMode != BindingMode.SimpleFollowWithWorldUp) { m_RecenterToTargetHeading.DoRecentering(ref axis, deltaTime, targetHeading); } float finalHeading = axis.Value; if (m_BindingMode == BindingMode.SimpleFollowWithWorldUp) { axis.Value = 0; } return(finalHeading); }
/// <summary>Notification that this virtual camera is going live. /// Base class implementation does nothing.</summary> /// <param name="fromCam">The camera being deactivated. May be null.</param> /// <param name="worldUp">Default world Up, set by the CinemachineBrain</param> /// <param name="deltaTime">Delta time for time-based effects (ignore if less than or equal to 0)</param> /// <returns>True if the vcam should do an internal update as a result of this call</returns> public override bool OnTransitionFromCamera( ICinemachineCamera fromCam, Vector3 worldUp, float deltaTime, ref CinemachineVirtualCameraBase.TransitionParams transitionParams) { m_HorizontalRecentering.DoRecentering(ref m_HorizontalAxis, -1, 0); m_VerticalRecentering.DoRecentering(ref m_VerticalAxis, -1, 0); m_HorizontalRecentering.CancelRecentering(); m_VerticalRecentering.CancelRecentering(); if (fromCam != null && transitionParams.m_InheritPosition) { Vector3 up = VcamState.ReferenceUp; Quaternion targetRot = fromCam.State.RawOrientation; Vector3 fwd = Vector3.forward; Transform parent = VirtualCamera.transform.parent; if (parent != null) fwd = parent.rotation * fwd; m_HorizontalAxis.Value = 0; m_HorizontalAxis.Reset(); Vector3 targetFwd = targetRot * Vector3.forward; Vector3 a = fwd.ProjectOntoPlane(up); Vector3 b = targetFwd.ProjectOntoPlane(up); if (!a.AlmostZero() && !b.AlmostZero()) m_HorizontalAxis.Value = Vector3.SignedAngle(a, b, up); m_VerticalAxis.Value = 0; m_VerticalAxis.Reset(); fwd = Quaternion.AngleAxis(m_HorizontalAxis.Value, up) * fwd; Vector3 right = Vector3.Cross(up, fwd); if (!right.AlmostZero()) m_VerticalAxis.Value = Vector3.SignedAngle(fwd, targetFwd, right); return true; } return false; }
/// <summary> /// Update the X axis and calculate the heading. This can be called by a delegate /// with a custom axis. /// <param name="deltaTime">Used for damping. If less than 0, no damping is done.</param> /// <param name="up">World Up, set by the CinemachineBrain</param> /// <param name="axis"></param> /// <param name="recentering"></param> /// <param name="isLive"/>true if the vcam is live</param> /// <returns>Axis value</returns> /// </summary> public float UpdateHeading( float deltaTime, Vector3 up, ref AxisState axis, ref AxisState.Recentering recentering, bool isLive) { // Only read joystick when game is playing if (deltaTime < 0 || !isLive) { axis.Reset(); recentering.CancelRecentering(); } else if (axis.Update(deltaTime)) { recentering.CancelRecentering(); } float targetHeading = GetTargetHeading(axis.Value, GetReferenceOrientation(up), deltaTime); if (deltaTime >= 0 && m_BindingMode != BindingMode.SimpleFollowWithWorldUp) { recentering.DoRecentering(ref axis, deltaTime, targetHeading); } float finalHeading = axis.Value; if (m_BindingMode == BindingMode.SimpleFollowWithWorldUp) { axis.Value = 0; } return(finalHeading); }