/// <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);
        }
Example #2
0
        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);
            }
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }