【问题标题】:My object is moving too fast in Unity?我的对象在 Unity 中移动得太快了?
【发布时间】:2018-03-27 01:43:30
【问题描述】:

我想实现一个 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;

编辑:对不起计算,所有这些都是正确的。直接来自幻灯片,我只需要更新功能的帮助:(

【问题讨论】:

  • 您在某处使用 Time.deltaTime 吗?或者可以使用 Time.deltaTime*0.01f 使其变慢
  • 将计算值乘以速度变量:public float speed = 3 然后Vector3 temp = ComputePointOnCatmullRomCurve(time, segCounter) * Time.deltaTime * speed。您可以在运行时从编辑器中更改/减少speed 变量,您会找到用于速度的适当值。

标签: unity3d spline


【解决方案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;
}    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2011-08-06
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多