【发布时间】:2014-12-30 16:49:30
【问题描述】:
下午好,
我正在尝试在 Unity 中实现一个 GameObject,它在给定 8 个受约束的随机值的情况下沿着 Cubic CatMull-Rom 样条线移动。我已经实现了一个函数,ComputePointOnCatmullRomCurve,它返回三次 Catmull-Rom 曲线上的一个点(给定一个从 0 到 1 的标量 'u' 和表示用于插值的 4 个点的段数)。
我在实现更新功能以使游戏对象顺利移动时遇到问题。我目前每次更新都调用 ComputePointOnCatmullRomCurve 并且每次都在增加 segment_number。然后将 GameObjects 位置设置为函数的结果。
但是,这会导致游戏对象移动得非常快。我相信我的更新函数不正确,但我不确定如何相对于插值函数输出的点移动游戏对象。
如果有人能够向我解释我做错了什么,或者提供示例或示例链接,那将非常有帮助!
计算曲线上的点的函数:
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;
谢谢!
马特
【问题讨论】:
-
既然您说它移动得太快,那么将
time += DT;更改为time += DT * Time.deltaTime;是否可以解决您的时间问题?见docs.unity3d.com/ScriptReference/Time-deltaTime.html -
您是否在每次更新调用中增加实体所在的段?
-
@Chris 添加 Time.delatTime 不能解决问题。时间变量可以设置为常数,比如 0.5 并且仍然会发生快速运动。
-
@MattCoubrough 是的,段的参考点每次更新都会增加,用于基于该初始点进行插值的其他三个点在 ComputePointOnCatmullRomCurve 内初始化
标签: c# unity3d interpolation gameobject catmull-rom-curve