private void CalculateCorner(NetSegment segment) { var cornerAngle = (IsStartSide ? segment.m_cornerAngleStart : segment.m_cornerAngleEnd) / 255f * 360f; if (IsLaneInvert) { cornerAngle = cornerAngle >= 180 ? cornerAngle - 180 : cornerAngle + 180; } CornerAngle = cornerAngle * Mathf.Deg2Rad; CornerDir = DriveLanes.Length <= 1 ? CornerAngle.Direction() : (DriveLanes.Last().NetLane.CalculatePosition(T) - DriveLanes.First().NetLane.CalculatePosition(T)).normalized; NormalDir = (DriveLanes.Any() ? DriveLanes.Aggregate(Vector3.zero, (v, l) => v + l.NetLane.CalculateDirection(T)).normalized : Vector3.zero) * (IsStartSide ? -1 : 1); NormalAngle = NormalDir.AbsoluteAngle(); var angle = Vector3.Angle(NormalDir, CornerDir); CornerAndNormalAngle = (angle > 90 ? 180 - angle : angle) * Mathf.Deg2Rad; }
public void Update() { var segment = GetSegment(); var segmentId = GetSegmentId(); Vector3 leftPos; Vector3 rightPos; Vector3 leftDir; Vector3 rightDir; if (IsStartSide) { segment.CalculateCorner(segmentId, true, true, true, out leftPos, out leftDir, out _); segment.CalculateCorner(segmentId, true, true, false, out rightPos, out rightDir, out _); } else { segment.CalculateCorner(segmentId, true, false, true, out leftPos, out leftDir, out _); segment.CalculateCorner(segmentId, true, false, false, out rightPos, out rightDir, out _); } CornerDir = (rightPos - leftPos).normalized; CornerAngle = CornerDir.AbsoluteAngle(); NormalDir = NormalSign * (leftDir + rightDir).normalized; NormalAngle = NormalDir.AbsoluteAngle(); var angle = Vector3.Angle(NormalDir, CornerDir); CornerAndNormalAngle = (angle > 90 ? 180 - angle : angle) * Mathf.Deg2Rad; TranformCoef = Mathf.Sin(CornerAndNormalAngle); Position = (leftPos + rightPos) / 2f; RoadHalfWidth = segment.Info.m_halfWidth - segment.Info.m_pavementWidth; FirstPointSide = GetPosition(-RoadHalfWidth); LastPointSide = GetPosition(RoadHalfWidth); Line = new StraightTrajectory(FirstPointSide, LastPointSide); }