Hello i am trying to implement 3 things into my spline that i need help with.
(1) As you can see in Pic1 there is a missing cube at the Control Points along the spline. How do i fix the missing cubes on the spline?
-Pic1
[76118-capture16.png*|76118]
(2) How do i change the Segment count as you can see in Pic2(SEG1)there is 9 yellow dots in between two points. How do i Increase/Decrease the amount of yellow dots?
(3) How do i have the Cubes follow the Tangent points after instantiating them(See Pic2(SEG2) to see what i mean)?
-Pic2
[76120-capture19.png*|76120]
And here is the code so you know what i have done.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Catmull : MonoBehaviour {
public List<Transform> controlPointsList = new List<Transform>();
public bool isLooping = true;
public GameObject obj;
Vector3 p0;
Vector3 p1;
Vector3 p2;
Vector3 p3;
void Start()
{
for(int i = 0; i < controlPointsList.Count; i++)
Object(i);
}
void OnDrawGizmos()
{
for (int i = 0; i < controlPointsList.Count; i++)
{
//Cant draw between the endpoints
//Neither do we need to draw from the second to the last endpoint
//...if we are not making a looping line
if ((i == 0 || i == controlPointsList.Count - 2 || i == controlPointsList.Count - 1) && !isLooping)
{
continue;
}
DisplayCatmullRomSpline(i);
}
Gizmos.color = Color.white;
//Draw a sphere at each control point
for (int i = 0; i < controlPointsList.Count; i++)
{
Gizmos.DrawWireSphere(controlPointsList*.position, 0.3f);*
}
}
Vector3 ReturnCatmullRom(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
Vector3 a = 0.5f * (2f * p1);
Vector3 b = 0.5f * (p2 - p0);
Vector3 c = 0.5f * (2f * p0 - 5f * p1 + 4f * p2 - p3);
Vector3 d = 0.5f * (-p0 + 3f * p1 - 3f * p2 + p3);
Vector3 pos = a + (b * t) + (c * t * t) + (d * t * t * t);
return pos;
}
void DisplayCatmullRomSpline(int pos)
{
//Clamp to allow looping
p0 = controlPointsList[ClampListPos(pos - 1)].position;
p1 = controlPointsList[pos].position;
p2 = controlPointsList[ClampListPos(pos + 1)].position;
p3 = controlPointsList[ClampListPos(pos + 2)].position;
//Just assign a tmp value to this
Vector3 lastPos = Vector3.zero;
//t is always between 0 and 1 and determines the resolution of the spline
//0 is always at p1
for (float t = 0; t < 1; t += 0.1f)
{
//Find the coordinates between the control points with a Catmull-Rom spline
Vector3 newPos = ReturnCatmullRom(t, p0, p1, p2, p3);
//Cant display anything the first iteration
if (t == 0)
{
lastPos = newPos;
continue;
}
Gizmos.color = Color.white;
Gizmos.DrawLine(lastPos, newPos);
Gizmos.color = Color.yellow;
var tan = ReturnCatmullRomTangent(t, p0, p1, p2, p3);
Gizmos.DrawLine(newPos, newPos + tan * 3);
Gizmos.DrawSphere(newPos, 0.3f);
lastPos = newPos;
}
//Also draw the last line since it is always less than 1, so we will always miss it
Gizmos.DrawLine(lastPos, p2);
}
//Clamp the list positions to allow looping
//start over again when reaching the end or beginning
int ClampListPos(int pos)
{
if (pos < 0)
{
pos = controlPointsList.Count - 1;
}
if (pos > controlPointsList.Count)
{
pos = 1;
}
else if (pos > controlPointsList.Count - 1)
{
pos = 0;
}
return pos;
}
public Vector3 ReturnCatmullRomTangent(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
Vector3 b = 0.5f * (p2 - p0);
Vector3 c = (2f * p0 - 5f * p1 + 4f * p2 - p3);
Vector3 d = 1.5f * (-p0 + 3f * p1 - 3f * p2 + p3);
Vector3 tangent = b + c * t + d * t * t;
return tangent.normalized;
}
void Object(int pos)
{
p0 = controlPointsList[ClampListPos(pos - 1)].position;
p1 = controlPointsList[pos].position;
p2 = controlPointsList[ClampListPos(pos + 1)].position;
p3 = controlPointsList[ClampListPos(pos + 2)].position;
Vector3 lastPos = Vector3.zero;
for (float t = 0; t < 1; t += 0.1f)
{
Vector3 newPos = ReturnCatmullRom(t, p0, p1, p2, p3);
if (t == 0)
{
lastPos = newPos;
continue;
}
var tan = ReturnCatmullRomTangent(t, p0, p1, p2, p3);
Instantiate(obj, newPos, Quaternion.LookRotation(tan));
lastPos = newPos;
}
}
}
*
*
@Bunny83