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); }
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; } }