예제 #1
0
    void FixedUpdate()
    {
        if (m_Path == null)
        {
            return;
        }

        m_PathPosition = m_Path.NormalizePos(m_PathPosition + m_Speed * Time.deltaTime);

        Vector3    newPos = m_Path.EvaluatePosition(m_PathPosition);
        Quaternion newRot = m_Path.EvaluateOrientation(m_PathPosition);

        // Apply the offset to get the new position
        Vector3[] offsetDir = new Vector3[3];
        offsetDir[2] = newRot * Vector3.forward;
        offsetDir[1] = newRot * Vector3.up;
        offsetDir[0] = Vector3.Cross(offsetDir[1], offsetDir[2]);
        for (int i = 0; i < 3; ++i)
        {
            newPos += m_PathOffset[i] * offsetDir[i];
        }

        transform.position = newPos;
        switch (m_RotationMode)
        {
        default:
        case RotationMode.Default:
            break;

        case RotationMode.Path:
            transform.rotation = newRot;
            break;

        case RotationMode.PathNoRoll:
            transform.rotation = Quaternion.LookRotation(newRot * Vector3.forward, Vector3.up);
            break;
        }
    }
예제 #2
0
        /// <summary>Positions the virtual camera according to the transposer rules.</summary>
        /// <param name="curState">The current camera state</param>
        /// <param name="statePrevFrame">The camera state on the previous frame (unused)</param>
        /// <param name="deltaTime">Used for damping.  If 0 or less, no damping is done.</param>
        /// <returns>curState with new RawPosition</returns>
        public CameraState MutateCameraState(
            CameraState curState, CameraState statePrevFrame, float deltaTime)
        {
            if (!IsValid)
            {
                return(curState);
            }

            if (deltaTime <= 0)
            {
                m_PreviousPathPosition = m_PathPosition;
            }

            CameraState newState = curState;

            // Get the new ideal path base position
            if (m_AutoDolly.m_Enabled)
            {
                m_PathPosition = PerformAutoDolly(m_PreviousPathPosition, deltaTime);
            }
            float newPathPosition = m_PathPosition;

            if (deltaTime > 0)
            {
                // Normalize previous position to find the shortest path
                if (m_Path.MaxPos > 0)
                {
                    float prev = m_Path.NormalizePos(m_PreviousPathPosition);
                    float next = m_Path.NormalizePos(newPathPosition);
                    if (m_Path.Looped && Mathf.Abs(next - prev) > m_Path.MaxPos / 2)
                    {
                        if (next > prev)
                        {
                            prev += m_Path.MaxPos;
                        }
                        else
                        {
                            prev -= m_Path.MaxPos;
                        }
                    }
                    m_PreviousPathPosition = prev;
                    newPathPosition        = next;
                }

                // Apply damping along the path direction
                float offset = m_PreviousPathPosition - newPathPosition;
                offset         *= deltaTime / Mathf.Max(m_ZDamping * kDampingScale, deltaTime);
                newPathPosition = m_PreviousPathPosition - offset;
            }
            m_PreviousPathPosition = newPathPosition;
            Quaternion newPathOrientation = m_Path.EvaluateOrientation(newPathPosition);

            // Apply the offset to get the new camera position
            Vector3 newCameraPos = m_Path.EvaluatePosition(newPathPosition);

            Vector3[] offsetDir = new Vector3[3];
            offsetDir[2] = newPathOrientation * Vector3.forward;
            offsetDir[1] = newPathOrientation * Vector3.up;
            offsetDir[0] = Vector3.Cross(offsetDir[1], offsetDir[2]);
            for (int i = 0; i < 3; ++i)
            {
                newCameraPos += m_PathOffset[i] * offsetDir[i];
            }

            // Apply damping to the remaining directions
            if (deltaTime > 0)
            {
                Vector3 currentCameraPos = statePrevFrame.RawPosition;
                Vector3 delta            = (currentCameraPos - newCameraPos);
                Vector3 delta1           = Vector3.Dot(delta, offsetDir[1]) * offsetDir[1];
                Vector3 delta0           = delta - delta1;
                delta = delta0 * deltaTime / Mathf.Max(m_XDamping * kDampingScale, deltaTime)
                        + delta1 * deltaTime / Mathf.Max(m_YDamping * kDampingScale, deltaTime);
                newCameraPos = currentCameraPos - delta;
            }
            newState.RawPosition = newCameraPos;

            // Set the up
            switch (m_CameraUp)
            {
            default:
            case CameraUpMode.Default:
                break;

            case CameraUpMode.Path:
                newState.ReferenceUp    = newPathOrientation * Vector3.up;
                newState.RawOrientation = newPathOrientation;
                break;

            case CameraUpMode.PathNoRoll:
                newState.RawOrientation = Quaternion.LookRotation(
                    newPathOrientation * Vector3.forward, Vector3.up);
                newState.ReferenceUp = newState.RawOrientation * Vector3.up;
                break;

            case CameraUpMode.FollowTarget:
                if (VirtualCamera.Follow != null)
                {
                    newState.RawOrientation = VirtualCamera.Follow.rotation;
                    newState.ReferenceUp    = newState.RawOrientation * Vector3.up;
                }
                break;

            case CameraUpMode.FollowTargetNoRoll:
                if (VirtualCamera.Follow != null)
                {
                    newState.RawOrientation = Quaternion.LookRotation(
                        VirtualCamera.Follow.rotation * Vector3.forward, Vector3.up);
                    newState.ReferenceUp = newState.RawOrientation * Vector3.up;
                }
                break;
            }
            return(newState);
        }
예제 #3
0
    public static void ResetInNearestPath(Transform t, Cinemachine.CinemachinePathBase p)
    {
        float pathPosition = p.FindClosestPoint(t.position, 0, -1, 10);

        t.position = p.EvaluatePosition(pathPosition);
    }