public void DrawGizmo() { Bezier bezier = Bezier.CubicBezier(p1.origin, p1.forward, p2.backward, p2.origin); float delta = 1 / RESOLUTION; for (var i = 0; i < RESOLUTION; i++) { Gizmos.color = Color.Lerp(p1.color, p2.color, i * delta); Gizmos.DrawLine(bezier.Calculate(i * delta), bezier.Calculate((i + 1) * delta)); } }
private void MoveAlongCurrentTrajectory() { progress = currentTrajectory.CalculateTByLength(progress, speed * Time.deltaTime); if (progress <= 1f) { transform.position = currentTrajectory.Calculate(progress); transform.forward = currentTrajectory.CalculateForward(progress); } }
void RecalculteLine() { if (source == null) { return; } if (thisRect == null) { thisRect = GetComponent <RectTransform>(); } thisRect.GetWorldCorners(ThisRectPoints); source.GetWorldCorners(sourcePoints); for (int i = 0; i < 4; i++) { ThisRectBorders[i] = (ThisRectPoints[i] + ThisRectPoints[(i + 1) % 4]) / 2; sourceBorders[i] = (sourcePoints[i] + sourcePoints[(i + 1) % 4]) / 2; } float minDistnace = System.Single.MaxValue; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { float thisDistance = (ThisRectBorders[i] - sourceBorders[j]).magnitude; if (thisDistance < minDistnace) { minDistnace = thisDistance; selectedFaces = new Vector2Int(i, j); arrow[0] = sourceBorders[j] + new Vector3(arrowAmt * ((i == 0 || i == 1) ? 1 : -1), arrowAmt * ((j == 0 || j == 1) ? 1 : -1)); arrow[1] = sourceBorders[j] + new Vector3(arrowAmt * ((i == 0 || i == 3) ? 1 : -1), arrowAmt * ((j == 1 || j == 2) ? 1 : -1)); } } } bezierAmount = minDistnace / Mathf.Max(thisRect.rect.width, source.rect.width, thisRect.rect.height, source.rect.height); computedPoints.Clear(); Vector3 startPos = ThisRectBorders[selectedFaces.x]; Vector3 endPos = sourceBorders[selectedFaces.y]; Vector3 startVect = startPos + bezierAmount * (startPos - thisRect.position); Vector3 endVect = endPos + bezierAmount * (endPos - source.position); for (float i = 0; i <= 1; i += 0.05f) { computedPoints.Add(Bezier.Calculate(i, startPos, startVect, endVect, endPos) + forward); } }
public static Vector3 GetPointPosition(Vector3 start, Vector3 end, Vector3 helper, float t) { return(Bezier.Calculate(start, helper, end, t)); }
public static Vector3 GetPointPosition(Vector3 start, Vector3 end, float t, float multiply) { Vector3 additionalPoint = Bezier.CenterOf(start, end) - new Vector3(0, multiply * Vector3.Distance(start, end) / 2, 0); return(Bezier.Calculate(start, additionalPoint, end, t)); }
void RecalculteLine() { #if UNITY_EDITOR if (target == null) { return; } if (thisRect == null) { thisRect = GetComponent <RectTransform>(); } thisRect.GetWorldCorners(thisRectPoints); target.GetWorldCorners(targetPoints); Vector2 thisCenter = Vector3.zero; Vector2 targetCenter = Vector3.zero; for (int i = 0; i < 4; i++) { thisRectBordersCenters[i] = Vector2.Lerp((Vector2)thisRectPoints[i], (Vector2)thisRectPoints[(i + 1) % 4], lineDetails.attachPointThis); sourceBorderCenters[i] = Vector2.Lerp((Vector2)targetPoints[i], (Vector2)targetPoints[(i + 1) % 4], lineDetails.attachPoint); thisCenter += thisRectBordersCenters[i]; targetCenter += sourceBorderCenters[i]; } float edgeLen = inverse ? (thisRectPoints[0] - thisRectPoints[2]).magnitude : (targetPoints[0] - targetPoints[2]).magnitude; edgeLen /= 4; thisCenter /= 4; targetCenter /= 4; float minDistnace = System.Single.MaxValue; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { float thisDistance = (thisRectBordersCenters[i] - sourceBorderCenters[j]).magnitude; if (thisDistance < minDistnace) { minDistnace = thisDistance; selectedFaces = new Vector2Int(i, j); } } } bezierAmount = minDistnace / Mathf.Max(thisRect.rect.width, target.rect.width, thisRect.rect.height, target.rect.height); computedPoints.Clear(); Vector3 sOfs = arrowInfo.marginStart * .1f * edgeLen * GetOffset(selectedFaces.x); Vector3 eOfs = arrowInfo.marginEnd * .1f * edgeLen * GetOffset(selectedFaces.y); Vector3 startPos = (Vector3)thisRectBordersCenters[selectedFaces.x] + sOfs; Vector3 endPos = (Vector3)sourceBorderCenters[selectedFaces.y] + eOfs; Vector3 sTan1 = (lineDetails.useAnchorPoint ? thisRect.position : (Vector3)thisCenter) + sOfs; Vector3 eTan1 = (lineDetails.useAnchorPoint ? target.position : (Vector3)targetCenter) + eOfs; Vector3 startTangent = startPos + bezierAmount * (startPos - sTan1) * lineDetails.bezierMultiplier * lineDetails.bezierMultiplier; Vector3 endTangent = endPos + bezierAmount * (endPos - eTan1) * lineDetails.bezierMultiplier * lineDetails.bezierMultiplier; if (inverse) { zExt.Swap(ref startPos, ref endPos); zExt.Swap(ref startTangent, ref endTangent); } lineDetails.distance = ((Vector2)endPos - (Vector2)startPos).magnitude; float step = lineDetails.GetStep(); if (lineDetails.bezierMultiplier > 0) { for (float i = 0; i <= 1; i += step) { computedPoints.Add(Bezier.Calculate(i, startPos, startTangent, endTangent, endPos)); } } else { for (float i = 0; i <= 1; i += step) { computedPoints.Add(Vector3.Lerp(startPos, endPos, i)); } } computedPoints.Add(endPos); if (colors == null || colors.Length != computedPoints.Count) { colors = new Color[computedPoints.Count]; } if (computedPoints.Count > 0) { float lerpStep = 1f / colors.Length; Color startColor = color; Color fadeColor = color; fadeColor.a *= inverse ? lineDetails.fadeStartAlpha : lineDetails.fadeEndAlpha; startColor.a *= !inverse ? lineDetails.fadeStartAlpha : lineDetails.fadeEndAlpha;; for (int i = 0; i < colors.Length; i++) { colors[i] = Color.Lerp(startColor, fadeColor, (inverse ? (colors.Length - i) : i) * lerpStep); } arrowInfo.SetPoints(computedPoints, edgeLen); } lineDetails.currentStepCount = computedPoints.Count; #endif }