我想要实现一个CatMull Rom Spline,并且我实现了它,但是球体移动到点非常快。我想如果我使用Time.DeltaTime它会减慢它,但它移动太快。
计算曲线上点的函数:
Vector3 ComputePointOnCatmullRomCurve(float u, int segmentNumber)
{
// TODO - compute and return a point as a Vector3
// Points on segment number 0 start at controlPoints[0] and end at controlPoints[1]
// Points on segment number 1 start at controlPoints[1] and end at controlPoints[2]
// etc...
Vector3 point = new Vector3();
float c0 = ((-u + 2f) * u - 1f) * u * 0.5f;
float c1 = (((3f * u - 5f) * u) * u + 2f) * 0.5f;
float c2 = ((-3f * u + 4f) * u + 1f) * u * 0.5f;
float c3 = ((u - 1f) * u * u) * 0.5f;
Vector3 p0 = controlPoints[(segmentNumber - 1) % NumberOfPoints];
Vector3 p1 = controlPoints[segmentNumber % NumberOfPoints];
Vector3 p2 = controlPoints[(segmentNumber + 1) % NumberOfPoints];
Vector3 p3 = controlPoints[(segmentNumber + 2) % NumberOfPoints];
point.x = (p0.x * c0) + (p1.x * c1) + (p2.x * c2) + (p3.x * c3);
point.y = (p0.y * c0) + (p1.y * c1) + (p2.y * c2) + (p3.y * c3);
point.x = (p0.z * c0) + (p1.z * c1) + (p2.z * c2) + (p3.z * c3);
return point;
}
**更新功能:**
void Update ()
{
// TODO - use time to determine values for u and segment_number in this function call
// 0.5 Can be used as u
time += DT;
segCounter++;
Vector3 temp = ComputePointOnCatmullRomCurve(time, segCounter);
transform.position = temp;
}
变量:
const int NumberOfPoints = 8;
Vector3[] controlPoints;
const int MinX = -5;
const int MinY = -5;
const int MinZ = 0;
const int MaxX = 5;
const int MaxY = 5;
const int MaxZ = 5;
float time = 0;
const float DT = 0.01f;
public static int segCounter = 0;
编辑:对不起计算,所有这些都是正确的。它直接来自幻灯片,我只需要更新功能的帮助:(
答案 0 :(得分:1)
使用Time.deltaTime
可让您独立于帧率。这意味着如果帧速率下降,或者帧比其他帧长,则对象将调整移动距离以保持恒定速度。这通常是一个好主意。
回到你的情况:基本上你想把一个位置传递给你的功能。你现在打发时间。如果你的catmull rom认为0是开始而1是目的地,那么在1秒之后,你将在样条曲线的末尾。 (请注意,这是帧速率独立的有趣之处:无论帧速率是多少,您都会在一秒内到达终点)。现在,如何从时间转换到位置。易
位置=时间*速度;
由于时间是秒,速度是以每秒为单位。说你的catmullrom是一个单位长。如果速度是2,如果需要一秒钟才能行驶两次。旅行它需要半秒钟。由于您希望降低速度,因此可能需要使用低于1的值。试试这个:
void Update ()
{
time += Time.deltaTime;
var speed = 0.1f;
var splinePos = speed * time;
segCounter++;
Vector3 temp = ComputePointOnCatmullRomCurve(splinePos, segCounter);
transform.position = temp;
}