public override Racetrack ApplyRacetrack(Racetrack racetrack) { angle = 0f; radius = 3f; //Generate(amountOfCPs); Vector3[] checkpoints = new Vector3[amountOfCPs]; for (int i = 0; i < amountOfCPs; i++) { //GameObject instCp = (GameObject)Instantiate(prefabControlpoint, instTrack.transform); angle += Random.Range(minAngle, maxAngle); radius += Random.Range(minRadius, maxRadius); Vector2 point = new Vector2(Mathf.Sin((angle * Mathf.PI) / 180f) * radius, Mathf.Cos((angle * Mathf.PI) / 180f) * radius); checkpoints[i] = new Vector3(point.x, 0f, point.y); //instCp.transform.position = new Vector3(point.x, 0f, point.y); //instCPs.Add(instCp); } ClosedSpline <Vector3> clSpline = new ClosedSpline <Vector3>(checkpoints); //if (instTrack != null) //{ racetrack.track = clSpline; //} return(racetrack); }
public void Refresh() { racetrack = new Racetrack(); racetrack = track.ApplyRacetrack(racetrack); racetrack = width.ApplyRacetrack(racetrack); racetrack = height.ApplyRacetrack(racetrack); racetrack = bend.ApplyRacetrack(racetrack); int tries = 0; while (racetrackOkay(racetrack) == false) { tries++; racetrack = new Racetrack(); racetrack = track.ApplyRacetrack(racetrack); racetrack = width.ApplyRacetrack(racetrack); racetrack = height.ApplyRacetrack(racetrack); racetrack = bend.ApplyRacetrack(racetrack); if (tries >= 2000) { break; } } Debug.Log("Tries: " + tries); racetrack = rendererProfiler.ApplyRacetrack(racetrack); }
private bool racetrackOkay(Racetrack track) { for (int i = 0; i < rules.Count; i++) { if (rules[i].Check(track) == false) { return(false); } } return(true); }
void Awake() { //if no instance of this exists, then assign this instance if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); } else { DestroyImmediate(this); } }
public override Racetrack ApplyRacetrack(Racetrack racetrack) { float[] cps = new float[racetrack.track.controlPoints.Length]; for (int i = 0; i < cps.Length; i++) { cps[i] = Random.Range(widthMin, widthMax); } ClosedSpline <float> widthSpline = new ClosedSpline <float>(cps); racetrack.width = widthSpline; return(racetrack); }
public override Racetrack ApplyRacetrack(Racetrack racetrack) { float[] cps = new float[checkpointsAmount]; for (int i = 0; i < cps.Length; i++) { float heightThere = terrain.SampleHeight(racetrack.track.SplineAt(((float)i) / ((float)cps.Length)) * 20f); //Debug.Log("Height (" + (int)(racetrack.track.controlPoints[i].x * 20f + transform.position.x) + "," + (int)(racetrack.track.controlPoints[i].z * 20f + transform.position.z) + "): " + heightThere); cps[i] = heightThere; } ClosedSpline <float> heightSpline = new ClosedSpline <float>(cps); racetrack.height = heightSpline; return(racetrack); }
public void Add(TrackWaypoint wp) { x_min = Math.Min(wp.X, x_min); x_max = Math.Max(wp.X, x_max); y_min = Math.Min(wp.Z, y_min); y_max = Math.Max(wp.Z, y_max); if (wp.Route == TrackRoute.MAIN) { Racetrack.Add(wp); } if (wp.Route == TrackRoute.PITLANE) { Pitlane.Add(wp); } }
public override Racetrack ApplyRacetrack(Racetrack racetrack) { float[] cps = new float[checkpointsAmount]; for (int i = 0; i < cps.Length; i++) { //Debug.Log("Height (" + (int)(racetrack.track.controlPoints[i].x * 20f + transform.position.x) + "," + (int)(racetrack.track.controlPoints[i].z * 20f + transform.position.z) + "): " + heightThere); Vector3 middlePosFirst = racetrack.track.SplineAt(((float)i) / ((float)cps.Length)); Vector3[] tangentFirst = racetrack.track.TangentAt(((float)i) / ((float)cps.Length)); Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0]; forwardFirst.Normalize(); Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst; sidewardsFirst.Normalize(); Vector3 leftFirst = (middlePosFirst - sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f); Vector3 rightFirst = (middlePosFirst + sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f); leftFirst *= 20f; rightFirst *= 20f; float heightLeft = terrain.SampleHeight(leftFirst); float heightRight = terrain.SampleHeight(rightFirst); Vector3 leftFirstH = leftFirst; Vector3 rightFirstH = rightFirst; leftFirstH.y = heightLeft; rightFirstH.y = heightRight; cps[i] = Vector3.Angle(leftFirst - rightFirst, leftFirstH - rightFirstH) * Mathf.Sign(heightRight - heightLeft); } ClosedSpline <float> heightSpline = new ClosedSpline <float>(cps); racetrack.bend = heightSpline; return(racetrack); }
public void Finalize() { Racetrack = Racetrack.OrderBy(x => x.Meters).ToList(); Pitlane = Pitlane.OrderBy(x => x.Meters).ToList(); Length = Racetrack.Max(x => x.Meters); }
public override bool Check(Racetrack racetrack) { float tolerance = 0.1f; int resolution = 400; List <Line> leftLines = new List <Line>(); List <Line> rightLines = new List <Line>(); Vector3 middlePosFirst = racetrack.track.SplineAt(0f); Vector3[] tangentFirst = racetrack.track.TangentAt(0f); Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0]; forwardFirst.Normalize(); Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst; sidewardsFirst.Normalize(); Vector2 leftFirst = new Vector2((middlePosFirst - sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).x, (middlePosFirst - sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).z); Vector2 rightFirst = new Vector2((middlePosFirst + sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).x, (middlePosFirst + sidewardsFirst * racetrack.width.SplineAt(0f) * 0.5f).z); for (int i = 1; i < resolution; i++) { float xPos = ((float)i) / ((float)resolution); Vector3 middlePos = racetrack.track.SplineAt(xPos); Vector3[] tangent = racetrack.track.TangentAt(xPos); Vector3 forward = tangent[1] - tangent[0]; forward.Normalize(); Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward; sidewards.Normalize(); Vector2 left = new Vector2((middlePos - sidewards * racetrack.width.SplineAt(xPos) * 0.5f).x, (middlePos - sidewards * racetrack.width.SplineAt(xPos) * 0.5f).z); Vector2 right = new Vector2((middlePos + sidewards * racetrack.width.SplineAt(xPos) * 0.5f).x, (middlePos + sidewards * racetrack.width.SplineAt(xPos) * 0.5f).z); leftLines.Add(new Line(leftFirst, left)); rightLines.Add(new Line(rightFirst, right)); leftFirst = left; rightFirst = right; for (int j = leftLines.Count - 2; j >= 0; j--) { Vector2 point; if (leftLines[j].IntersectsOffset(leftLines[leftLines.Count - 1], tolerance, out point)) { return(false); } } for (int j = rightLines.Count - 2; j >= 0; j--) { Vector2 point; if (rightLines[j].IntersectsOffset(rightLines[rightLines.Count - 1], tolerance, out point)) { return(false); } } } return(true); }
public virtual bool Check(Racetrack racetrack) { return(true); }
// Use this for initialization void Start() { rules = new List <RTRule>(); rules.Add(new CurveRule()); racetrack = new Racetrack(); }
public override Racetrack ApplyRacetrack(Racetrack racetrack) { if (instTrack != null) { Destroy(instTrack); instTrack = null; } instTrack = Instantiate(renderedTrackPrefab, transform); instTrack.transform.localPosition = Vector3.zero; Vector3[] leftCps = new Vector3[racetrack.track.controlPoints.Length]; Vector3[] rightCps = new Vector3[racetrack.track.controlPoints.Length]; for (int i = 0; i < leftCps.Length; i++) { Vector3 cpPos = racetrack.track.controlPoints[i]; Vector3[] tangentCp = racetrack.track.TangentAt(((float)i) / ((float)leftCps.Length)); Vector3 forwardCp = tangentCp[1] - tangentCp[0]; forwardCp.Normalize(); Vector3 sidewardsCp = Quaternion.Euler(0f, 90f, 0f) * forwardCp; sidewardsCp.Normalize(); rightCps[i] = cpPos + sidewardsCp * racetrack.width.controlPoints[i] * 0.5f; leftCps[i] = cpPos - sidewardsCp * racetrack.width.controlPoints[i] * 0.5f; } ClosedSpline <Vector3> leftTrack = new ClosedSpline <Vector3>(leftCps); ClosedSpline <Vector3> rightTrack = new ClosedSpline <Vector3>(rightCps); MeshFilter meshFilter = instTrack.GetComponent <MeshFilter>(); List <Vector3> vertices = new List <Vector3>(); List <int> triangles = new List <int>(); List <Vector2> uvs = new List <Vector2>(); List <int> trianglesWhite = new List <int>(); List <int> trianglesGrass = new List <int>(); float xPosFirst = 0f; /*Vector3 middlePosFirst = racetrack.track.SplineAt(xPosFirst); * * Vector3[] tangentFirst = racetrack.track.TangentAt(xPosFirst); * * Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0]; * forwardFirst.Normalize(); * Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst; * * sidewardsFirst.Normalize(); * * Vector3 firstl_p = sidewardsFirst * -0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst; * Vector3 firstr_p = sidewardsFirst * 0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst; * * Vector3 firstl_whiteBegin = firstl_p + sidewardsFirst * whiteStripOffset; * Vector3 firstr_whiteBegin = firstr_p - sidewardsFirst * whiteStripOffset; * * Vector3 firstl_whiteInner = firstl_whiteBegin + sidewardsFirst * whiteStripWidth; * Vector3 firstr_whiteInner = firstr_whiteBegin - sidewardsFirst * whiteStripWidth; * * Vector3 firstl_grassSameHeight = firstl_p - sidewardsFirst * grassWidth; * Vector3 firstr_grassSameHeight = firstr_p + sidewardsFirst * grassWidth; * * Vector3 firstl_grassHill = firstl_grassSameHeight - sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight; * Vector3 firstr_grassHill = firstr_grassSameHeight + sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight;*/ Vector3[] tangentFirstLeft = leftTrack.TangentAt(xPosFirst); Vector3 forwardFirstLeft = tangentFirstLeft[1] - tangentFirstLeft[0]; forwardFirstLeft.Normalize(); Vector3 sidewardsFirstLeft = Quaternion.Euler(0f, 90f, 0f) * forwardFirstLeft; sidewardsFirstLeft.Normalize(); Vector3[] tangentFirstRight = rightTrack.TangentAt(xPosFirst); Vector3 forwardFirstRight = tangentFirstRight[1] - tangentFirstRight[0]; forwardFirstRight.Normalize(); Vector3 sidewardsFirstRight = Quaternion.Euler(0f, 90f, 0f) * forwardFirstRight; sidewardsFirstRight.Normalize(); Vector3 firstl_p = leftTrack.SplineAt(xPosFirst); Vector3 firstr_p = rightTrack.SplineAt(xPosFirst); Vector3 firstl_whiteBegin = firstl_p + sidewardsFirstLeft * whiteStripOffset; Vector3 firstr_whiteBegin = firstr_p - sidewardsFirstRight * whiteStripOffset; Vector3 firstl_whiteInner = firstl_whiteBegin + sidewardsFirstLeft * whiteStripWidth; Vector3 firstr_whiteInner = firstr_whiteBegin - sidewardsFirstRight * whiteStripWidth; Vector3 firstl_grassSameHeight = firstl_p - sidewardsFirstLeft * grassWidth; Vector3 firstr_grassSameHeight = firstr_p + sidewardsFirstRight * grassWidth; Vector3 firstl_grassHill = firstl_grassSameHeight - sidewardsFirstLeft * grassHillWidth + Vector3.Cross(sidewardsFirstLeft, forwardFirstLeft) * grassHillHeight; Vector3 firstr_grassHill = firstr_grassSameHeight + sidewardsFirstRight * grassHillWidth + Vector3.Cross(sidewardsFirstRight, forwardFirstRight) * grassHillHeight; vertices.Add(firstl_grassHill); vertices.Add(firstl_grassSameHeight); vertices.Add(firstl_p); vertices.Add(firstl_whiteBegin); vertices.Add(firstl_whiteInner); vertices.Add(firstr_whiteInner); vertices.Add(firstr_whiteBegin); vertices.Add(firstr_p); vertices.Add(firstr_grassSameHeight); vertices.Add(firstr_grassHill); uvs.Add(new Vector2(firstl_grassHill.x, firstl_grassHill.z)); uvs.Add(new Vector2(firstl_grassSameHeight.x, firstl_grassSameHeight.z)); uvs.Add(new Vector2(firstl_p.x, firstl_p.z)); uvs.Add(new Vector2(firstl_whiteBegin.x, firstl_whiteBegin.z)); uvs.Add(new Vector2(firstl_whiteInner.x, firstl_whiteInner.z)); uvs.Add(new Vector2(firstr_whiteInner.x, firstr_whiteInner.z)); uvs.Add(new Vector2(firstr_whiteBegin.x, firstr_whiteBegin.z)); uvs.Add(new Vector2(firstr_p.x, firstr_p.z)); uvs.Add(new Vector2(firstr_grassSameHeight.x, firstr_grassSameHeight.z)); uvs.Add(new Vector2(firstr_grassHill.x, firstr_grassHill.z)); for (int i = 1; i < resolution; i++) { float xPos = ((float)i) / ((float)resolution); /*Vector3 middlePos = racetrack.track.SplineAt(xPos); * * Vector3[] tangent = racetrack.track.TangentAt(xPos); * * Vector3 forward = tangent[1] - tangent[0]; * forward.Normalize(); * Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward; * * sidewards.Normalize(); * * Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos; * Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos; * * Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset; * Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset; * * Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth; * Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth; * * Vector3 l_grassSameHeight = l_p - sidewards * grassWidth; * Vector3 r_grassSameHeight = r_p + sidewards * grassWidth; * * Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight; * Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight;*/ Vector3[] tangentLeft = leftTrack.TangentAt(xPos); Vector3 forwardLeft = tangentLeft[1] - tangentLeft[0]; forwardLeft.Normalize(); Vector3 sidewardsLeft = Quaternion.Euler(0f, 90f, 0f) * forwardLeft; sidewardsLeft.Normalize(); Vector3[] tangentRight = rightTrack.TangentAt(xPos); Vector3 forwardRight = tangentRight[1] - tangentRight[0]; forwardRight.Normalize(); Vector3 sidewardsRight = Quaternion.Euler(0f, 90f, 0f) * forwardRight; sidewardsRight.Normalize(); Vector3 l_p = leftTrack.SplineAt(xPos); Vector3 r_p = rightTrack.SplineAt(xPos); Vector3 l_whiteBegin = l_p + sidewardsLeft * whiteStripOffset; Vector3 r_whiteBegin = r_p - sidewardsRight * whiteStripOffset; Vector3 l_whiteInner = l_whiteBegin + sidewardsLeft * whiteStripWidth; Vector3 r_whiteInner = r_whiteBegin - sidewardsRight * whiteStripWidth; Vector3 l_grassSameHeight = l_p - sidewardsLeft * grassWidth; Vector3 r_grassSameHeight = r_p + sidewardsRight * grassWidth; Vector3 l_grassHill = l_grassSameHeight - sidewardsLeft * grassHillWidth + Vector3.Cross(sidewardsLeft, forwardLeft) * grassHillHeight; Vector3 r_grassHill = r_grassSameHeight + sidewardsRight * grassHillWidth + Vector3.Cross(sidewardsRight, forwardRight) * grassHillHeight; vertices.Add(l_grassHill); vertices.Add(l_grassSameHeight); vertices.Add(l_p); vertices.Add(l_whiteBegin); vertices.Add(l_whiteInner); vertices.Add(r_whiteInner); vertices.Add(r_whiteBegin); vertices.Add(r_p); vertices.Add(r_grassSameHeight); vertices.Add(r_grassHill); uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z)); uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z)); uvs.Add(new Vector2(l_p.x, l_p.z)); uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z)); uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z)); uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z)); uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z)); uvs.Add(new Vector2(r_p.x, r_p.z)); uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z)); uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z)); triangles.Add((i - 1) * 10 + 2); triangles.Add((i - 0) * 10 + 2); triangles.Add((i - 1) * 10 + 3); triangles.Add((i - 1) * 10 + 3); triangles.Add((i - 0) * 10 + 2); triangles.Add((i - 0) * 10 + 3); triangles.Add((i - 1) * 10 + 4); triangles.Add((i - 0) * 10 + 4); triangles.Add((i - 1) * 10 + 5); triangles.Add((i - 1) * 10 + 5); triangles.Add((i - 0) * 10 + 4); triangles.Add((i - 0) * 10 + 5); triangles.Add((i - 1) * 10 + 6); triangles.Add((i - 0) * 10 + 6); triangles.Add((i - 1) * 10 + 7); triangles.Add((i - 1) * 10 + 7); triangles.Add((i - 0) * 10 + 6); triangles.Add((i - 0) * 10 + 7); trianglesWhite.Add((i - 1) * 10 + 3); trianglesWhite.Add((i - 0) * 10 + 3); trianglesWhite.Add((i - 1) * 10 + 4); trianglesWhite.Add((i - 1) * 10 + 4); trianglesWhite.Add((i - 0) * 10 + 3); trianglesWhite.Add((i - 0) * 10 + 4); trianglesWhite.Add((i - 1) * 10 + 5); trianglesWhite.Add((i - 0) * 10 + 5); trianglesWhite.Add((i - 1) * 10 + 6); trianglesWhite.Add((i - 1) * 10 + 6); trianglesWhite.Add((i - 0) * 10 + 5); trianglesWhite.Add((i - 0) * 10 + 6); trianglesGrass.Add((i - 1) * 10 + 0); trianglesGrass.Add((i - 0) * 10 + 0); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 0); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 2); trianglesGrass.Add((i - 1) * 10 + 2); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 2); trianglesGrass.Add((i - 1) * 10 + 7); trianglesGrass.Add((i - 0) * 10 + 7); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 7); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 9); trianglesGrass.Add((i - 1) * 10 + 9); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 9); } if (true) { #region Last One triangles.Add((resolution - 1) * 10 + 2); triangles.Add((0) * 10 + 2); triangles.Add((resolution - 1) * 10 + 3); triangles.Add((resolution - 1) * 10 + 3); triangles.Add((0) * 10 + 2); triangles.Add((0) * 10 + 3); triangles.Add((resolution - 1) * 10 + 4); triangles.Add((0) * 10 + 4); triangles.Add((resolution - 1) * 10 + 5); triangles.Add((resolution - 1) * 10 + 5); triangles.Add((0) * 10 + 4); triangles.Add((0) * 10 + 5); triangles.Add((resolution - 1) * 10 + 6); triangles.Add((0) * 10 + 6); triangles.Add((resolution - 1) * 10 + 7); triangles.Add((resolution - 1) * 10 + 7); triangles.Add((0) * 10 + 6); triangles.Add((0) * 10 + 7); trianglesWhite.Add((resolution - 1) * 10 + 3); trianglesWhite.Add((0) * 10 + 3); trianglesWhite.Add((resolution - 1) * 10 + 4); trianglesWhite.Add((resolution - 1) * 10 + 4); trianglesWhite.Add((0) * 10 + 3); trianglesWhite.Add((0) * 10 + 4); trianglesWhite.Add((resolution - 1) * 10 + 5); trianglesWhite.Add((0) * 10 + 5); trianglesWhite.Add((resolution - 1) * 10 + 6); trianglesWhite.Add((resolution - 1) * 10 + 6); trianglesWhite.Add((0) * 10 + 5); trianglesWhite.Add((0) * 10 + 6); trianglesGrass.Add((resolution - 1) * 10 + 0); trianglesGrass.Add((0) * 10 + 0); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((0) * 10 + 0); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 2); trianglesGrass.Add((resolution - 1) * 10 + 2); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((0) * 10 + 2); trianglesGrass.Add((resolution - 1) * 10 + 7); trianglesGrass.Add((0) * 10 + 7); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((0) * 10 + 7); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 9); trianglesGrass.Add((resolution - 1) * 10 + 9); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((0) * 10 + 9); #endregion } meshFilter.mesh.Clear(); meshFilter.mesh.vertices = vertices.ToArray(); meshFilter.mesh.uv = uvs.ToArray(); meshFilter.mesh.subMeshCount = 3; Debug.Log("Submeshcount: " + meshFilter.mesh.subMeshCount); meshFilter.mesh.SetTriangles(triangles.ToArray(), 0); meshFilter.mesh.SetTriangles(trianglesWhite.ToArray(), 1); meshFilter.mesh.SetTriangles(trianglesGrass.ToArray(), 2); meshFilter.mesh.RecalculateNormals(); instTrack.GetComponent <MeshCollider>().sharedMesh = meshFilter.mesh; /*for (int i = 0; i < resolution; i++) * { * float xPos = ((float)i) / ((float)resolution); * * GameObject inst = (GameObject)Instantiate(prefabPoint); * inst.transform.position = racetrack.track.SplineAt(xPos); * }*/ return(racetrack); }
public virtual Racetrack ApplyRacetrack(Racetrack racetrack) { return(racetrack); }
public override Racetrack ApplyRacetrack(Racetrack racetrack) { List <Line> lines = new List <Line>(); if (instTrack != null) { Destroy(instTrack); instTrack = null; } instTrack = Instantiate(renderedTrackPrefab, transform); instTrack.transform.localPosition = Vector3.zero; MeshFilter meshFilter = instTrack.GetComponent <MeshFilter>(); List <Vector3> vertices = new List <Vector3>(); List <int> triangles = new List <int>(); List <Vector2> uvs = new List <Vector2>(); List <int> trianglesWhite = new List <int>(); List <int> trianglesGrass = new List <int>(); float xPosFirst = 0f; Vector3 middlePosFirst = racetrack.track.SplineAt(xPosFirst); Vector3[] tangentFirst = racetrack.track.TangentAt(xPosFirst); Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0]; forwardFirst.Normalize(); Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst; sidewardsFirst.Normalize(); Vector3 firstl_p = sidewardsFirst * -0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst; Vector3 firstr_p = sidewardsFirst * 0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst; Vector3 middlePos_lOFirst = middlePosFirst - sidewardsFirst * 0.01f; Vector3 middlePos_rOFirst = middlePosFirst + sidewardsFirst * 0.01f; lines.Add(new Line(new Vector2(middlePos_lOFirst.x, middlePos_lOFirst.z), new Vector2(firstl_p.x, firstl_p.z))); lines.Add(new Line(new Vector2(middlePos_rOFirst.x, middlePos_rOFirst.z), new Vector2(firstr_p.x, firstr_p.z))); Vector3 firstl_whiteBegin = firstl_p + sidewardsFirst * whiteStripOffset; Vector3 firstr_whiteBegin = firstr_p - sidewardsFirst * whiteStripOffset; Vector3 firstl_whiteInner = firstl_whiteBegin + sidewardsFirst * whiteStripWidth; Vector3 firstr_whiteInner = firstr_whiteBegin - sidewardsFirst * whiteStripWidth; Vector3 firstl_grassSameHeight = firstl_p - sidewardsFirst * grassWidth; Vector3 firstr_grassSameHeight = firstr_p + sidewardsFirst * grassWidth; Vector3 firstl_grassHill = firstl_grassSameHeight - sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight; Vector3 firstr_grassHill = firstr_grassSameHeight + sidewardsFirst * grassHillWidth + Vector3.Cross(sidewardsFirst, forwardFirst) * grassHillHeight; //Vector3 firstl_np = sidewardsFirst * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //Vector3 firstr_np = sidewardsFirst * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //vertices.Add(firstl_p); //vertices.Add(firstr_p); vertices.Add(firstl_grassHill); vertices.Add(firstl_grassSameHeight); vertices.Add(firstl_p); vertices.Add(firstl_whiteBegin); vertices.Add(firstl_whiteInner); vertices.Add(firstr_whiteInner); vertices.Add(firstr_whiteBegin); vertices.Add(firstr_p); vertices.Add(firstr_grassSameHeight); vertices.Add(firstr_grassHill); uvs.Add(new Vector2(firstl_grassHill.x, firstl_grassHill.z)); uvs.Add(new Vector2(firstl_grassSameHeight.x, firstl_grassSameHeight.z)); uvs.Add(new Vector2(firstl_p.x, firstl_p.z)); uvs.Add(new Vector2(firstl_whiteBegin.x, firstl_whiteBegin.z)); uvs.Add(new Vector2(firstl_whiteInner.x, firstl_whiteInner.z)); uvs.Add(new Vector2(firstr_whiteInner.x, firstr_whiteInner.z)); uvs.Add(new Vector2(firstr_whiteBegin.x, firstr_whiteBegin.z)); uvs.Add(new Vector2(firstr_p.x, firstr_p.z)); uvs.Add(new Vector2(firstr_grassSameHeight.x, firstr_grassSameHeight.z)); uvs.Add(new Vector2(firstr_grassHill.x, firstr_grassHill.z)); Vector3 old_l_grassHill = firstl_grassHill; Vector3 old_l_grassSameHeight = firstl_grassSameHeight; Vector3 old_l_p = firstl_p; Vector3 old_l_whiteBegin = firstl_whiteBegin; Vector3 old_l_whiteInner = firstl_whiteInner; Vector3 old_r_whiteInner = firstr_whiteInner; Vector3 old_r_whiteBegin = firstr_whiteBegin; Vector3 old_r_p = firstr_p; Vector3 old_r_grassSameHeight = firstr_grassSameHeight; Vector3 old_r_grassHill = firstr_grassHill; for (int i = 1; i < resolution; i++) { float xPos = ((float)i) / ((float)resolution); Vector3 middlePos = racetrack.track.SplineAt(xPos); Vector3[] tangent = racetrack.track.TangentAt(xPos); Vector3 forward = tangent[1] - tangent[0]; forward.Normalize(); Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward; sidewards.Normalize(); Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos; Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos; Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset; Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset; Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth; Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth; Vector3 l_grassSameHeight = l_p - sidewards * grassWidth; Vector3 r_grassSameHeight = r_p + sidewards * grassWidth; Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight; Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight; Vector3 middlePos_lO = middlePos - sidewards * 0.01f; Vector3 middlePos_rO = middlePos + sidewards * 0.01f; Line leftLine = new Line(new Vector2(middlePos_lO.x, middlePos_lO.z), new Vector2(l_p.x, l_p.z)); if (checkLines(leftLine, lines) == false) { old_l_grassHill = l_grassHill; old_l_grassSameHeight = l_grassSameHeight; old_l_p = l_p; old_l_whiteBegin = l_whiteBegin; old_l_whiteInner = l_whiteInner; } lines.Add(new Line(new Vector2(middlePos_lO.x, middlePos_lO.z), new Vector2(l_p.x, l_p.z))); Line rightLine = new Line(new Vector2(middlePos_rO.x, middlePos_rO.z), new Vector2(r_p.x, r_p.z)); if (checkLines(rightLine, lines) == false) { old_r_grassHill = r_grassHill; old_r_grassSameHeight = r_grassSameHeight; old_r_p = r_p; old_r_whiteBegin = r_whiteBegin; old_r_whiteInner = r_whiteInner; } lines.Add(new Line(new Vector2(middlePos_rO.x, middlePos_rO.z), new Vector2(r_p.x, r_p.z))); //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //vertices.Add(l_p); //vertices.Add(r_p); vertices.Add(old_l_grassHill); vertices.Add(old_l_grassSameHeight); vertices.Add(old_l_p); vertices.Add(old_l_whiteBegin); vertices.Add(old_l_whiteInner); vertices.Add(old_r_whiteInner); vertices.Add(old_r_whiteBegin); vertices.Add(old_r_p); vertices.Add(old_r_grassSameHeight); vertices.Add(old_r_grassHill); uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z)); uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z)); uvs.Add(new Vector2(l_p.x, l_p.z)); uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z)); uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z)); uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z)); uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z)); uvs.Add(new Vector2(r_p.x, r_p.z)); uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z)); uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z)); triangles.Add((i - 1) * 10 + 2); triangles.Add((i - 0) * 10 + 2); triangles.Add((i - 1) * 10 + 3); triangles.Add((i - 1) * 10 + 3); triangles.Add((i - 0) * 10 + 2); triangles.Add((i - 0) * 10 + 3); triangles.Add((i - 1) * 10 + 4); triangles.Add((i - 0) * 10 + 4); triangles.Add((i - 1) * 10 + 5); triangles.Add((i - 1) * 10 + 5); triangles.Add((i - 0) * 10 + 4); triangles.Add((i - 0) * 10 + 5); triangles.Add((i - 1) * 10 + 6); triangles.Add((i - 0) * 10 + 6); triangles.Add((i - 1) * 10 + 7); triangles.Add((i - 1) * 10 + 7); triangles.Add((i - 0) * 10 + 6); triangles.Add((i - 0) * 10 + 7); trianglesWhite.Add((i - 1) * 10 + 3); trianglesWhite.Add((i - 0) * 10 + 3); trianglesWhite.Add((i - 1) * 10 + 4); trianglesWhite.Add((i - 1) * 10 + 4); trianglesWhite.Add((i - 0) * 10 + 3); trianglesWhite.Add((i - 0) * 10 + 4); trianglesWhite.Add((i - 1) * 10 + 5); trianglesWhite.Add((i - 0) * 10 + 5); trianglesWhite.Add((i - 1) * 10 + 6); trianglesWhite.Add((i - 1) * 10 + 6); trianglesWhite.Add((i - 0) * 10 + 5); trianglesWhite.Add((i - 0) * 10 + 6); trianglesGrass.Add((i - 1) * 10 + 0); trianglesGrass.Add((i - 0) * 10 + 0); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 0); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 2); trianglesGrass.Add((i - 1) * 10 + 2); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 2); trianglesGrass.Add((i - 1) * 10 + 7); trianglesGrass.Add((i - 0) * 10 + 7); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 7); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 9); trianglesGrass.Add((i - 1) * 10 + 9); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 9); } if (true) { #region Last One /*float xPos = 0f; * * Vector3 middlePos = racetrack.track.SplineAt(xPos); * * Vector3[] tangent = racetrack.track.TangentAt(xPos); * * Vector3 forward = tangent[1] - tangent[0]; * forward.Normalize(); * Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward; * * sidewards.Normalize(); * * Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos; * Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos; * * Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset; * Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset; * * Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth; * Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth; * * Vector3 l_grassSameHeight = l_p - sidewards * grassWidth; * Vector3 r_grassSameHeight = r_p + sidewards * grassWidth; * * Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight; * Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight; * * //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); * //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); * * //vertices.Add(l_p); * //vertices.Add(r_p); * * vertices.Add(l_grassHill); * vertices.Add(l_grassSameHeight); * vertices.Add(l_p); * vertices.Add(l_whiteBegin); * vertices.Add(l_whiteInner); * vertices.Add(r_whiteInner); * vertices.Add(r_whiteBegin); * vertices.Add(r_p); * vertices.Add(r_grassSameHeight); * vertices.Add(r_grassHill); * * uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z)); * uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z)); * uvs.Add(new Vector2(l_p.x, l_p.z)); * uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z)); * uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z)); * uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z)); * uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z)); * uvs.Add(new Vector2(r_p.x, r_p.z)); * uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z)); * uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z));*/ triangles.Add((resolution - 1) * 10 + 2); triangles.Add((0) * 10 + 2); triangles.Add((resolution - 1) * 10 + 3); triangles.Add((resolution - 1) * 10 + 3); triangles.Add((0) * 10 + 2); triangles.Add((0) * 10 + 3); triangles.Add((resolution - 1) * 10 + 4); triangles.Add((0) * 10 + 4); triangles.Add((resolution - 1) * 10 + 5); triangles.Add((resolution - 1) * 10 + 5); triangles.Add((0) * 10 + 4); triangles.Add((0) * 10 + 5); triangles.Add((resolution - 1) * 10 + 6); triangles.Add((0) * 10 + 6); triangles.Add((resolution - 1) * 10 + 7); triangles.Add((resolution - 1) * 10 + 7); triangles.Add((0) * 10 + 6); triangles.Add((0) * 10 + 7); trianglesWhite.Add((resolution - 1) * 10 + 3); trianglesWhite.Add((0) * 10 + 3); trianglesWhite.Add((resolution - 1) * 10 + 4); trianglesWhite.Add((resolution - 1) * 10 + 4); trianglesWhite.Add((0) * 10 + 3); trianglesWhite.Add((0) * 10 + 4); trianglesWhite.Add((resolution - 1) * 10 + 5); trianglesWhite.Add((0) * 10 + 5); trianglesWhite.Add((resolution - 1) * 10 + 6); trianglesWhite.Add((resolution - 1) * 10 + 6); trianglesWhite.Add((0) * 10 + 5); trianglesWhite.Add((0) * 10 + 6); trianglesGrass.Add((resolution - 1) * 10 + 0); trianglesGrass.Add((0) * 10 + 0); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((0) * 10 + 0); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 2); trianglesGrass.Add((resolution - 1) * 10 + 2); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((0) * 10 + 2); trianglesGrass.Add((resolution - 1) * 10 + 7); trianglesGrass.Add((0) * 10 + 7); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((0) * 10 + 7); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 9); trianglesGrass.Add((resolution - 1) * 10 + 9); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((0) * 10 + 9); #endregion } meshFilter.mesh.Clear(); meshFilter.mesh.vertices = vertices.ToArray(); meshFilter.mesh.uv = uvs.ToArray(); meshFilter.mesh.subMeshCount = 3; Debug.Log("Submeshcount: " + meshFilter.mesh.subMeshCount); meshFilter.mesh.SetTriangles(triangles.ToArray(), 0); meshFilter.mesh.SetTriangles(trianglesWhite.ToArray(), 1); meshFilter.mesh.SetTriangles(trianglesGrass.ToArray(), 2); meshFilter.mesh.RecalculateNormals(); instTrack.GetComponent <MeshCollider>().sharedMesh = meshFilter.mesh; /*for (int i = 0; i < resolution; i++) * { * float xPos = ((float)i) / ((float)resolution); * * GameObject inst = (GameObject)Instantiate(prefabPoint); * inst.transform.position = racetrack.track.SplineAt(xPos); * }*/ return(racetrack); }
public override Racetrack ApplyRacetrack(Racetrack racetrack) { if (instTrack != null) { Destroy(instTrack); instTrack = null; } instTrack = Instantiate(renderedTrackPrefab, transform); instTrack.transform.localPosition = Vector3.zero; instTrack.transform.localScale = new Vector3(20f, 1f, 20f); MeshFilter meshFilter = instTrack.GetComponent <MeshFilter>(); List <Vector3> vertices = new List <Vector3>(); List <int> triangles = new List <int>(); List <Vector2> uvs = new List <Vector2>(); List <int> trianglesWhite = new List <int>(); List <int> trianglesGrass = new List <int>(); float xPosFirst = 0f; Vector3 middlePosFirst = racetrack.track.SplineAt(xPosFirst); middlePosFirst.y = racetrack.height.SplineAt(xPosFirst); Vector3[] tangentFirst = racetrack.track.TangentAt(xPosFirst); Vector3 forwardFirst = tangentFirst[1] - tangentFirst[0]; forwardFirst.Normalize(); Vector3 sidewardsFirst = Quaternion.Euler(0f, 90f, 0f) * forwardFirst; Vector3 upwardsFirst = Vector3.Cross(sidewardsFirst, forwardFirst) * -1f; upwardsFirst.Normalize(); float distUpFirst = Mathf.Tan((racetrack.bend.SplineAt(xPosFirst) * Mathf.PI) / 180f); upwardsFirst *= distUpFirst; upwardsFirst *= 20f; sidewardsFirst.Normalize(); Vector3 firstl_p = (sidewardsFirst + upwardsFirst) * -0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst; Vector3 firstr_p = (sidewardsFirst + upwardsFirst) * 0.5f * racetrack.width.SplineAt(xPosFirst) + middlePosFirst; Vector3 firstl_whiteBegin = firstl_p + (sidewardsFirst + upwardsFirst) * whiteStripOffset; Vector3 firstr_whiteBegin = firstr_p - (sidewardsFirst + upwardsFirst) * whiteStripOffset; Vector3 firstl_whiteInner = firstl_whiteBegin + (sidewardsFirst + upwardsFirst) * whiteStripWidth; Vector3 firstr_whiteInner = firstr_whiteBegin - (sidewardsFirst + upwardsFirst) * whiteStripWidth; Vector3 firstl_grassSameHeight = firstl_p - (sidewardsFirst + upwardsFirst) * grassWidth; Vector3 firstr_grassSameHeight = firstr_p + (sidewardsFirst + upwardsFirst) * grassWidth; Vector3 firstl_grassHill = firstl_grassSameHeight - (sidewardsFirst + upwardsFirst) * grassHillWidth + Vector3.Cross((sidewardsFirst), forwardFirst) * grassHillHeight; Vector3 firstr_grassHill = firstr_grassSameHeight + (sidewardsFirst + upwardsFirst) * grassHillWidth + Vector3.Cross((sidewardsFirst), forwardFirst) * grassHillHeight; //Vector3 firstl_np = sidewardsFirst * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //Vector3 firstr_np = sidewardsFirst * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //vertices.Add(firstl_p); //vertices.Add(firstr_p); vertices.Add(firstl_grassHill); vertices.Add(firstl_grassSameHeight); vertices.Add(firstl_p); vertices.Add(firstl_whiteBegin); vertices.Add(firstl_whiteInner); vertices.Add(firstr_whiteInner); vertices.Add(firstr_whiteBegin); vertices.Add(firstr_p); vertices.Add(firstr_grassSameHeight); vertices.Add(firstr_grassHill); uvs.Add(new Vector2(firstl_grassHill.x, firstl_grassHill.z)); uvs.Add(new Vector2(firstl_grassSameHeight.x, firstl_grassSameHeight.z)); uvs.Add(new Vector2(firstl_p.x, firstl_p.z)); uvs.Add(new Vector2(firstl_whiteBegin.x, firstl_whiteBegin.z)); uvs.Add(new Vector2(firstl_whiteInner.x, firstl_whiteInner.z)); uvs.Add(new Vector2(firstr_whiteInner.x, firstr_whiteInner.z)); uvs.Add(new Vector2(firstr_whiteBegin.x, firstr_whiteBegin.z)); uvs.Add(new Vector2(firstr_p.x, firstr_p.z)); uvs.Add(new Vector2(firstr_grassSameHeight.x, firstr_grassSameHeight.z)); uvs.Add(new Vector2(firstr_grassHill.x, firstr_grassHill.z)); for (int i = 1; i < resolution; i++) { float xPos = ((float)i) / ((float)resolution); Vector3 middlePos = racetrack.track.SplineAt(xPos); middlePos.y = racetrack.height.SplineAt(xPos); Vector3[] tangent = racetrack.track.TangentAt(xPos); Vector3 forward = tangent[1] - tangent[0]; forward.Normalize(); Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward; Vector3 upwards = Vector3.Cross(sidewards, forward) * -1f; upwards.Normalize(); float distUp = Mathf.Tan((racetrack.bend.SplineAt(xPos) * Mathf.PI) / 180f); upwards *= distUp; upwards *= 20f; //upwards = new Vector3(0f, 1f, 0f); Debug.Log("Distup: " + distUp); sidewards.Normalize(); Vector3 l_p = (sidewards + upwards) * -0.5f * racetrack.width.SplineAt(xPos) + middlePos; Vector3 r_p = (sidewards + upwards) * 0.5f * racetrack.width.SplineAt(xPos) + middlePos; Vector3 l_whiteBegin = l_p + (sidewards + upwards) * whiteStripOffset; Vector3 r_whiteBegin = r_p - (sidewards + upwards) * whiteStripOffset; Vector3 l_whiteInner = l_whiteBegin + (sidewards + upwards) * whiteStripWidth; Vector3 r_whiteInner = r_whiteBegin - (sidewards + upwards) * whiteStripWidth; Vector3 l_grassSameHeight = l_p - (sidewards + upwards) * grassWidth; Vector3 r_grassSameHeight = r_p + (sidewards + upwards) * grassWidth; Vector3 l_grassHill = l_grassSameHeight - (sidewards + upwards) * grassHillWidth + Vector3.Cross((sidewards), forward) * grassHillHeight; Vector3 r_grassHill = r_grassSameHeight + (sidewards + upwards) * grassHillWidth + Vector3.Cross((sidewards), forward) * grassHillHeight; //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); //vertices.Add(l_p); //vertices.Add(r_p); vertices.Add(l_grassHill); vertices.Add(l_grassSameHeight); vertices.Add(l_p); vertices.Add(l_whiteBegin); vertices.Add(l_whiteInner); vertices.Add(r_whiteInner); vertices.Add(r_whiteBegin); vertices.Add(r_p); vertices.Add(r_grassSameHeight); vertices.Add(r_grassHill); uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z)); uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z)); uvs.Add(new Vector2(l_p.x, l_p.z)); uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z)); uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z)); uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z)); uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z)); uvs.Add(new Vector2(r_p.x, r_p.z)); uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z)); uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z)); triangles.Add((i - 1) * 10 + 2); triangles.Add((i - 0) * 10 + 2); triangles.Add((i - 1) * 10 + 3); triangles.Add((i - 1) * 10 + 3); triangles.Add((i - 0) * 10 + 2); triangles.Add((i - 0) * 10 + 3); triangles.Add((i - 1) * 10 + 4); triangles.Add((i - 0) * 10 + 4); triangles.Add((i - 1) * 10 + 5); triangles.Add((i - 1) * 10 + 5); triangles.Add((i - 0) * 10 + 4); triangles.Add((i - 0) * 10 + 5); triangles.Add((i - 1) * 10 + 6); triangles.Add((i - 0) * 10 + 6); triangles.Add((i - 1) * 10 + 7); triangles.Add((i - 1) * 10 + 7); triangles.Add((i - 0) * 10 + 6); triangles.Add((i - 0) * 10 + 7); trianglesWhite.Add((i - 1) * 10 + 3); trianglesWhite.Add((i - 0) * 10 + 3); trianglesWhite.Add((i - 1) * 10 + 4); trianglesWhite.Add((i - 1) * 10 + 4); trianglesWhite.Add((i - 0) * 10 + 3); trianglesWhite.Add((i - 0) * 10 + 4); trianglesWhite.Add((i - 1) * 10 + 5); trianglesWhite.Add((i - 0) * 10 + 5); trianglesWhite.Add((i - 1) * 10 + 6); trianglesWhite.Add((i - 1) * 10 + 6); trianglesWhite.Add((i - 0) * 10 + 5); trianglesWhite.Add((i - 0) * 10 + 6); trianglesGrass.Add((i - 1) * 10 + 0); trianglesGrass.Add((i - 0) * 10 + 0); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 0); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 1) * 10 + 2); trianglesGrass.Add((i - 1) * 10 + 2); trianglesGrass.Add((i - 0) * 10 + 1); trianglesGrass.Add((i - 0) * 10 + 2); trianglesGrass.Add((i - 1) * 10 + 7); trianglesGrass.Add((i - 0) * 10 + 7); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 7); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 1) * 10 + 9); trianglesGrass.Add((i - 1) * 10 + 9); trianglesGrass.Add((i - 0) * 10 + 8); trianglesGrass.Add((i - 0) * 10 + 9); } if (true) { #region Last One /*float xPos = 0f; * * Vector3 middlePos = racetrack.track.SplineAt(xPos); * * Vector3[] tangent = racetrack.track.TangentAt(xPos); * * Vector3 forward = tangent[1] - tangent[0]; * forward.Normalize(); * Vector3 sidewards = Quaternion.Euler(0f, 90f, 0f) * forward; * * sidewards.Normalize(); * * Vector3 l_p = sidewards * -0.5f * racetrack.width.SplineAt(xPos) + middlePos; * Vector3 r_p = sidewards * 0.5f * racetrack.width.SplineAt(xPos) + middlePos; * * Vector3 l_whiteBegin = l_p + sidewards * whiteStripOffset; * Vector3 r_whiteBegin = r_p - sidewards * whiteStripOffset; * * Vector3 l_whiteInner = l_whiteBegin + sidewards * whiteStripWidth; * Vector3 r_whiteInner = r_whiteBegin - sidewards * whiteStripWidth; * * Vector3 l_grassSameHeight = l_p - sidewards * grassWidth; * Vector3 r_grassSameHeight = r_p + sidewards * grassWidth; * * Vector3 l_grassHill = l_grassSameHeight - sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight; * Vector3 r_grassHill = r_grassSameHeight + sidewards * grassHillWidth + Vector3.Cross(sidewards, forward) * grassHillHeight; * * //Vector3 l_np = sidewards * -0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); * //Vector3 r_np = sidewards * 0.5f * racetrack.width.SplineAt(((float)i + 1) / ((float)resolution)); * * //vertices.Add(l_p); * //vertices.Add(r_p); * * vertices.Add(l_grassHill); * vertices.Add(l_grassSameHeight); * vertices.Add(l_p); * vertices.Add(l_whiteBegin); * vertices.Add(l_whiteInner); * vertices.Add(r_whiteInner); * vertices.Add(r_whiteBegin); * vertices.Add(r_p); * vertices.Add(r_grassSameHeight); * vertices.Add(r_grassHill); * * uvs.Add(new Vector2(l_grassHill.x, l_grassHill.z)); * uvs.Add(new Vector2(l_grassSameHeight.x, l_grassSameHeight.z)); * uvs.Add(new Vector2(l_p.x, l_p.z)); * uvs.Add(new Vector2(l_whiteBegin.x, l_whiteBegin.z)); * uvs.Add(new Vector2(l_whiteInner.x, l_whiteInner.z)); * uvs.Add(new Vector2(r_whiteInner.x, r_whiteInner.z)); * uvs.Add(new Vector2(r_whiteBegin.x, r_whiteBegin.z)); * uvs.Add(new Vector2(r_p.x, r_p.z)); * uvs.Add(new Vector2(r_grassSameHeight.x, r_grassSameHeight.z)); * uvs.Add(new Vector2(r_grassHill.x, r_grassHill.z));*/ triangles.Add((resolution - 1) * 10 + 2); triangles.Add((0) * 10 + 2); triangles.Add((resolution - 1) * 10 + 3); triangles.Add((resolution - 1) * 10 + 3); triangles.Add((0) * 10 + 2); triangles.Add((0) * 10 + 3); triangles.Add((resolution - 1) * 10 + 4); triangles.Add((0) * 10 + 4); triangles.Add((resolution - 1) * 10 + 5); triangles.Add((resolution - 1) * 10 + 5); triangles.Add((0) * 10 + 4); triangles.Add((0) * 10 + 5); triangles.Add((resolution - 1) * 10 + 6); triangles.Add((0) * 10 + 6); triangles.Add((resolution - 1) * 10 + 7); triangles.Add((resolution - 1) * 10 + 7); triangles.Add((0) * 10 + 6); triangles.Add((0) * 10 + 7); trianglesWhite.Add((resolution - 1) * 10 + 3); trianglesWhite.Add((0) * 10 + 3); trianglesWhite.Add((resolution - 1) * 10 + 4); trianglesWhite.Add((resolution - 1) * 10 + 4); trianglesWhite.Add((0) * 10 + 3); trianglesWhite.Add((0) * 10 + 4); trianglesWhite.Add((resolution - 1) * 10 + 5); trianglesWhite.Add((0) * 10 + 5); trianglesWhite.Add((resolution - 1) * 10 + 6); trianglesWhite.Add((resolution - 1) * 10 + 6); trianglesWhite.Add((0) * 10 + 5); trianglesWhite.Add((0) * 10 + 6); trianglesGrass.Add((resolution - 1) * 10 + 0); trianglesGrass.Add((0) * 10 + 0); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((0) * 10 + 0); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 1); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((resolution - 1) * 10 + 2); trianglesGrass.Add((resolution - 1) * 10 + 2); trianglesGrass.Add((0) * 10 + 1); trianglesGrass.Add((0) * 10 + 2); trianglesGrass.Add((resolution - 1) * 10 + 7); trianglesGrass.Add((0) * 10 + 7); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((0) * 10 + 7); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 8); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((resolution - 1) * 10 + 9); trianglesGrass.Add((resolution - 1) * 10 + 9); trianglesGrass.Add((0) * 10 + 8); trianglesGrass.Add((0) * 10 + 9); #endregion } meshFilter.mesh.Clear(); meshFilter.mesh.vertices = vertices.ToArray(); meshFilter.mesh.uv = uvs.ToArray(); meshFilter.mesh.subMeshCount = 3; //Debug.Log("Submeshcount: " + meshFilter.mesh.subMeshCount); meshFilter.mesh.SetTriangles(triangles.ToArray(), 0); meshFilter.mesh.SetTriangles(trianglesWhite.ToArray(), 1); meshFilter.mesh.SetTriangles(trianglesGrass.ToArray(), 2); meshFilter.mesh.RecalculateNormals(); instTrack.GetComponent <MeshCollider>().sharedMesh = meshFilter.mesh; /*for (int i = 0; i < resolution; i++) * { * float xPos = ((float)i) / ((float)resolution); * * GameObject inst = (GameObject)Instantiate(prefabPoint); * inst.transform.position = racetrack.track.SplineAt(xPos); * }*/ return(racetrack); }