Exemple #1
0
        private void PrepareReaction()
        {
            Vector3 ignoreLocalSpeed = GetCameraIdeaPivot.InverseTransformDirection(preset.Instance.CameraPivot.Velocity) - preset.Instance.CameraPivot.LocalVelocity;
            float   relativeSpeed    = Vector3.zero.Distance(ignoreLocalSpeed) / Time.fixedDeltaTime;
            float   peak             = Mathf.Min(2f, relativeSpeed * m_RadiusSpeedFactor);

            m_Radius = Mathf.Lerp(m_Radius, peak, Time.fixedDeltaTime);
            float radius   = m_Radius + m_SafeRadiusFar;
            float distance = GetCameraIdeaDistance;

            Transform
                org = m_BasedOnVirtualFaceTarget ? GetCameraLookAt : GetChaseTarget;

            Vector3
                cam = GetCameraIdeaPivot.position,
            //current = GetCameraCurrentPivot.position,
                cUp    = GetCameraIdeaPivot.TransformPoint(Vector3.up * radius),
                cDown  = GetCameraIdeaPivot.TransformPoint(-Vector3.up * radius),
                cLeft  = GetCameraIdeaPivot.TransformPoint(-Vector3.right * radius),
                cRight = GetCameraIdeaPivot.TransformPoint(Vector3.right * radius),
                oUp    = org.position.PointOnDistance(GetCameraIdeaPivot.up, m_SafeRadiusNear),
                oDown  = org.position.PointOnDistance(-GetCameraIdeaPivot.up, m_SafeRadiusNear),
                oLeft  = org.position.PointOnDistance(-GetCameraIdeaPivot.right, m_SafeRadiusNear),
                oRight = org.position.PointOnDistance(GetCameraIdeaPivot.right, m_SafeRadiusNear);

            float
                finalPos = PointRay(org.position, cam, distance),
                fixUp = m_SafeDistance - DirectionRay(GetCameraCurrentPivot.TransformPoint(Vector3.up * .1f), GetCameraIdeaPivot.up, m_SafeDistance),
                fixDown = m_SafeDistance - DirectionRay(GetCameraCurrentPivot.TransformPoint(-Vector3.up * .1f), -GetCameraIdeaPivot.up, m_SafeDistance),
                fixLeft = m_SafeDistance - DirectionRay(GetCameraCurrentPivot.TransformPoint(-Vector3.right * .1f), -GetCameraIdeaPivot.right, m_SafeDistance),
                fixRight = m_SafeDistance - DirectionRay(GetCameraCurrentPivot.TransformPoint(Vector3.right * .1f), GetCameraIdeaPivot.right, m_SafeDistance),
                fixH = 0f, fixV = 0f;

            // avoid contact by safe distance.
            fixV = Mathf.Lerp(-fixDown, fixUp, 0.5f);             // center
            fixH = Mathf.Lerp(-fixLeft, fixRight, 0.5f);          // center

            // check eye sight, predict obstacle avoidance.
            if (Mathf.Approximately(0f, finalPos))
            {
                float[] arr = new float[] {
                    PointRay(oUp, cUp, distance),
                    PointRay(oDown, cDown, distance),
                    PointRay(oLeft, cLeft, distance),
                    PointRay(oRight, cRight, distance)
                };
                finalPos = Mathf.Max(arr);
            }

            ToLocalPosition = new Vector3(fixH, fixV, finalPos);
        }
Exemple #2
0
        private float DirectionRay(Vector3 startPoint, Vector3 direction, float distance)
        {
            Debug.DrawRay(startPoint, direction, Color.yellow);
            RaycastHit hit;

            if (Physics.Raycast(startPoint, direction, out hit, distance, ~m_IgnoreLayerMask, QueryTriggerInteraction.UseGlobal))
            {
                Debug.DrawLine(startPoint, hit.point, Color.red, 0.01f);
                Vector3 point = GetCameraIdeaPivot.InverseTransformPoint(hit.point);

                // we only care about Z-axis
                return(point.z);
            }
            return(0f);
        }
        private void BackwardRaycast()
        {
            RaycastHit hit;

            if (Physics.Raycast(
                    GetCameraLookAt.position,
                    GetCameraIdeaDirection,
                    out hit,
                    GetCameraIdeaDistance,
                    ~m_IgnoreLayerMask,
                    QueryTriggerInteraction.UseGlobal))
            {
                ToLocalPosition = GetCameraIdeaPivot.InverseTransformPoint(hit.point.PointOnDistance(-GetCameraIdeaDirection, m_SafeDistance));
                Debug.DrawLine(GetCameraLookAt.position, hit.point, Color.red, 0.01f);
            }
            else
            {
                ToLocalPosition = Vector3.zero;
            }
        }