Vector 从V1到移动V2的Unity3D线性插值

Vector 从V1到移动V2的Unity3D线性插值,vector,unity3d,interpolation,Vector,Unity3d,Interpolation,我在stack math网站上发布了这个问题,但他们不太乐意看到包括编程在内的问题。不管怎样,现在我在这里:) 我有一个对象,它位于MyTransform.position(向量) 该对象应跟随所需位置(向量),即 以变化的速度向不同的方向移动 MaxDelayDistance(float)是我的对象允许的最大距离 必须到理想的位置 DelayRecovery(float)是对象移动所需的秒数 如果达到MaxDelayDistance,则返回所需位置 时间。deltaTime(float)是我

我在stack math网站上发布了这个问题,但他们不太乐意看到包括编程在内的问题。不管怎样,现在我在这里:)


  • 我有一个对象,它位于MyTransform.position(向量)
  • 该对象应跟随所需位置(向量),即 以变化的速度向不同的方向移动
  • MaxDelayDistance(float)是我的对象允许的最大距离 必须到理想的位置
  • DelayRecovery(float)是对象移动所需的秒数 如果达到MaxDelayDistance,则返回所需位置
  • 时间。deltaTime(float)是我们用来描述上一次的时间的术语 帧更新已完成。它的值通常约为0.025f

  • 主要的问题是我的目标没有顺利地跟随期望的位置。 它从MaxDelayDistance跳到所需位置并返回。
    不知何故,我的Lerp函数中的分数(t)总是导致约1.005或约0.001。你能发现我的方法有什么问题吗?

    我看到了几个问题,我不确定你选择的方向(至少以前从未见过类似的方向)

    序言:

    Vector3.Distance(lerpStart, DesiredPosition)
    
    这是一个常数,是
    DesiredPosition
    周围的半径

    以下是我注意到的一些问题:

    问题1

    lerpT
    对于距离大于
    MaxDelayDistance
    (半径外)的每个点,始终>=1。因此,当对象距离
    MaxDelayDistance
    更远时,它将立即移动到
    DesiredPosition

    问题2

    DelayRecovery(float)是对象移动所需的秒数 如果达到MaxDelayDistance,则返回所需位置

    不确定是否完全理解了你复杂的lerp,顺便说一句,上面的说法似乎是错误的<代码>延迟恢复在执行lerping时始终被考虑,不管距离有多远

    问题3

    当您接近
    所需位置时,可能被零除(
    *
    运算符在
    /
    之前计算)

    一些考虑

    我会更加仔细地阅读您的代码,并尝试找出背后的逻辑。这是我从未见过的东西。 向给定位置移动的一些一般方法:

  • 如果起点和终点已知且固定,则lerping(或an)允许精确控制行程时间增量t参数从0到1
  • 如果目的地正在移动,您仍然可以使用lerp平滑地跟踪目标(从理论角度来看,可能不是更正确的使用,也可能不是物理上的真实,但在任何情况下都是有效的)。在这种情况下,Lerp因素是一种“朝向目标的速度”。与目标距离成有效线性比例
  • 一些基于物理的方法。整合定义某种最大速度和最大加速度,并计算下一个位置(最终夹紧以防止超调和振荡)
  • 控制器。功率很大,但我总是觉得很难调整
  • 还可以考虑使用,下面是它的实现方式:

    public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta)
        {
            Vector3 a = target - current;
            float magnitude = a.magnitude;
            if (magnitude <= maxDistanceDelta || magnitude == 0f)
            {
                return target;
            }
            return current + a / magnitude * maxDistanceDelta;
        }
    
    公共静态矢量3移动方向(矢量3当前、矢量3目标、浮点maxDistanceDelta)
    {
    矢量3 a=目标-电流;
    浮动幅度=a.幅度;
    
    如果(幅度如果我正确理解您的目标,您可以通过计算
    dirToDesiredPosition
    ,跟踪某个增加每帧的值
    distanceMoved
    ,然后将对象移动到
    lerpStart+dirToDesiredPosition*distanceMoved
    ,来获得更一致的结果。我一回到我的位置,就会检查这一点c、 感谢您的解释!感谢非常有用的提示!我考虑了您的想法并实施了一些有效的方法。我还将尝试其他技巧以找到最适合的方法。我可能只是在尝试找出一些方法时感到困惑,并提出了一个非常复杂的不可行的解决方案。感谢您为我澄清此问题。:D
    public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta)
        {
            Vector3 a = target - current;
            float magnitude = a.magnitude;
            if (magnitude <= maxDistanceDelta || magnitude == 0f)
            {
                return target;
            }
            return current + a / magnitude * maxDistanceDelta;
        }