- Home /
Problem with curved Cornered Spline that i need help with
Hello i have been trying to do this in Pic1, but i cant do it, iv'e been trying different ways but it is either deformed or just gets errors, the closest i could get is in Pic2, but its not what i want, would anyone know how to fix this???
(visit here more about the positioning on the blue dots)
-Pic1.(What i am trying to do) NOTE: segments = segCount
-Pic2.(The results i am getting)
And here is the code so you know what i have done.
using UnityEngine; using System.Collections; using System.Collections.Generic;
public class Spline : MonoBehaviour {
[System.Serializable] public class SplinePoint { public Transform t; public Transform cpAhead; public Transform cpBehind; public int seg; public SplinePoint(Transform thetrans, Transform a, Transform b, int s) { t = thetrans; cpAhead = a; cpBehind = b; seg = s; } } public List<Transform> controlPointsList; public List<SplinePoint> splinePoints; public Transform segment; public int segCount = 2; public int curveSegments = 5; public float updateRate = 60f; public bool setup = false; public bool running = false; public float distance; void Start() { splinePoints = new List<SplinePoint>(); CreateObjects(segment,distance); } public void CreateObjects(Transform original, float distance) { for (int i = 0; i < controlPointsList.Count - 1; i++) { for (int j = 0; j < segCount; j++) { var a = Instantiate(original, Vector3.zero, Quaternion.identity) as Transform; splinePoints.Add(new SplinePoint(a.transform, controlPointsList[i + 1], controlPointsList[i], j)); } } setup = true; } void Update() { if (setup && !running) { UpdateSplinePos(); } } //- void UpdateSplinePos() { for (int i = 0; i < splinePoints.Count; i++) { SetPosition(splinePoints[i]); } } SplinePoint GetSplinePoint(int s) { SplinePoint sp = null; if (splinePoints.Count > 0) { for (int i = 0; i < splinePoints.Count; i++) { if (splinePoints[i].seg == s) { sp = splinePoints[i]; break; } } } return sp; } void OnDrawGizmos() { if (!setup) { return; } Gizmos.color = Color.white; for (int i = 0; i < controlPointsList.Count; i++) { Gizmos.DrawWireSphere(controlPointsList[i].position, 0.3f); } for (int i = 0; i < controlPointsList.Count - 1; i++) { Gizmos.DrawLine(controlPointsList[i].position, controlPointsList[i + 1].position); } //Get a list of associated nodes relative to control point. We want the last of the current control point and the first of the next control point for (int i = 0; i < controlPointsList.Count - 1; i++) { if (i == controlPointsList.Count - 2) { break; } //retrieve the 3 points of the curve List<Vector3> curvepoints = SplineCurve(controlPointsList[i], controlPointsList[i + 1]); Vector3 p0 = curvepoints[0]; Vector3 p1 = curvepoints[1]; Vector3 p2 = curvepoints[2]; //draw a line between the start of the curve and the end of the curve for reference //Gizmos.color = Color.red; // Gizmos.DrawLine(p0, p2); Vector3 lastPos = Vector3.zero; Gizmos.color = Color.blue; for (int n = 0; n < curveSegments + 1; n++) { float t = (float)n / curveSegments; Vector3 newPos = GetPoint(p0, p1, p2, t); if (t == 0) { lastPos = newPos; continue; } Gizmos.DrawLine(lastPos, newPos); Gizmos.color = Color.yellow; var tan = GetTangent(p0, p1, p2, t); //Gizmos.DrawLine(newPos, newPos + tan * 0.5f); Gizmos.DrawSphere(newPos, 0.3f); lastPos = newPos; } } } List<SplinePoint> NodesAssociated(Transform behindNode) { List<SplinePoint> p = new List<SplinePoint>(); for (int i = 0; i < splinePoints.Count; i++) { if (splinePoints[i].cpBehind == behindNode) { p.Add(splinePoints[i]); } } return p; } List<Vector3> SplineCurve(Transform current, Transform ahead) { List<Vector3> curvePoints = new List<Vector3>(); //Find the first point in the curve for (int i = 0; i < splinePoints.Count; i++) { //we need the nodes associated with the current transform //since we store the segment value in the spline point, all we need is the segment that has the max segment count stored if (splinePoints[i].cpBehind == current && splinePoints[i].seg == segCount - 1) { curvePoints.Add(splinePoints[i].t.position); break; } } //the second point in the curve is the next control point curvePoints.Add(ahead.position); //Find the last point in the curve for (int i = 0; i < splinePoints.Count; i++) { //we need the nodes associated with the ahead transform //since we store the segment value in the spline point, all we need is the segment that has 0 as its seg if (splinePoints[i].cpBehind == ahead && splinePoints[i].seg == 0) { curvePoints.Add(splinePoints[i].t.position); break; } } return curvePoints; } //- void SetPosition(SplinePoint sp) { //float dist = Vector3.Distance(sp.cpAhead.position, sp.cpBehind.position); //float step = dist / (segCount + 1); //Vector3 dir = (sp.cpAhead.position - sp.cpBehind.position).normalized; //sp.t.position = sp.cpBehind.position + ((dir * step) * (sp.seg + 1)); //sp.t.rotation = Quaternion.LookRotation(dir); for (int i = 0; i < controlPointsList.Count - 1; i++) { float xDiff = controlPointsList[i + 1].position.x - controlPointsList[i].position.x; float yDiff = controlPointsList[i + 1].position.y - controlPointsList[i].position.y; float zDiff = controlPointsList[i + 1].position.z - controlPointsList[i].position.z; float dist = Mathf.Sqrt(xDiff * xDiff + yDiff * yDiff + zDiff * zDiff); if (dist < segCount * distance) distance = dist / segCount; float step = distance / dist; Vector3 oneDistance = new Vector3(); oneDistance.x = xDiff * step; oneDistance.y = yDiff * step; oneDistance.z = zDiff * step; Vector3 dir = (sp.cpAhead.position - sp.cpBehind.position).normalized; sp.t.position = sp.cpBehind.position + ((dir * step) * (sp.seg + 1)); sp.t.rotation = Quaternion.LookRotation(dir); } } public static Vector3 GetPoint(Vector3 p0, Vector3 p1, Vector3 p2, float t) { t = Mathf.Clamp01(t); float oneMinusT = 1f - t; return oneMinusT * oneMinusT * p0 + 2f * oneMinusT * t * p1 + t * t * p2; } public static Vector3 GetTangent(Vector3 p0, Vector3 p1, Vector3 p2, float t) { return 2f * (1f - t) * (p1 - p0) + 2f * t * (p2 - p1); } }
Your answer
Follow this Question
Related Questions
How do i do this type of spline?? 1 Answer
How do i make a Linear Spline?? 1 Answer
Adding segments in missing spots 1 Answer
How do i create points along a spline??? 0 Answers
What is Matrix4x4? 2 Answers