【问题标题】:Unity3D Linear interpolation from V1 to moving V2Unity3D从V1线性插值到移动V2
【发布时间】:2015-04-30 14:03:20
【问题描述】:

我在堆栈数学网站上发布了这个问题,但他们并不太兴奋看到包括编程在内的问题。无论如何,现在我在这里:)


  1. 我有一个对象,它位于 MyTransform.position(矢量)
  2. 该对象应遵循 DesiredPosition(矢量),即 以不断变化的速度向各个方向移动
  3. MaxDelayDistance (float) 是允许我的对象的最大距离 必须到达 DesiredPosition。
  4. DelayRecovery(浮点数)是我的对象移动的秒数 如果达到 MaxDelayDistance,则到 DesiredPosition。
  5. Time.deltaTime (float) 是我们用来描述上次时间的术语 帧更新了。它的值通常约为 0.025f。

private Vector3 GetLerpedPosition(Vector3 DesiredPosition) {
            //DesiredPosition now contains the goal
            Vector3 dirToDesiredPosition = (DesiredPosition - MyTransform.position).normalized; //Direction to desired position
            Vector3 lerpStart = DesiredPosition + (-dirToDesiredPosition * MaxDelayDistance); //Start the lerp at my farthest allowed position
            float lerpCurrentT = Vector3.Distance(MyTransform.position, DesiredPosition) / Vector3.Distance(lerpStart, DesiredPosition); //My current fragtion (t) of the lerp

            //Now I lerp from lerpStart to DesiredPosition using a calculated fraction
            Vector3 result = Vector3.Lerp(
                lerpStart,
                DesiredPosition,
                lerpCurrentT + (DelayRecovery / MaxDelayDistance * Vector3.Distance(MyTransform.position, DesiredPosition) * Time.deltaTime)
                );
            return result;
        }

主要问题是我的对象没有顺利跟随 DesiredPosition。 它从 MaxDelayDistance 跳转到 DesiredPosition 并返回。 不知何故,我的 Lerp 函数中的分数 (t) 总是导致大约 1.005 或大约 0.001。你能发现我的方法中的任何问题吗?

【问题讨论】:

  • 如果我正确理解您的目标,您可以通过计算dirToDesiredPosition、跟踪增加每一帧的某个值distanceMoved、然后将对象移动到lerpStart + dirToDesiredPosition * distanceMoved 来获得更一致的结果。跨度>

标签: vector unity3d interpolation


【解决方案1】:

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

序言:

Vector3.Distance(lerpStart, DesiredPosition)

这是一个常数,是DesiredPosition 周围的半径。

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

问题 1

lerpT 对于每一个比MaxDelayDistance(半径外)更远的点总是 >=1。所以当一个对象比MaxDelayDistance更远时,它会立即移动到DesiredPosition

问题 2

DelayRecovery (float) 是我的对象移动的秒数 如果达到 MaxDelayDistance,则到 DesiredPosition。

不确定是否完全理解了您错综复杂的 lerp,顺便说一句,上面的陈述似乎是错误的。 DelayRecover 尽管距离较远,但总是被考虑在内。

问题 3

关闭到DesiredPosition 时可能被零除(* 运算符在/ 之前评估)

一些注意事项

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

  1. 如果起点和终点已知且固定,则 lerping(或 ease function)允许精确控制行程时间,将 t 参数从 0 增加到 1。
  2. 如果目的地在移动,您仍然可以使用 lerp 平滑跟随目标(从理论角度来看,这可能不是更正确的用法,也不是物理现实,但无论如何都有效)。在这种情况下,Lerp 因素是一种“朝着目标前进的速度”。与与目标的距离成比例的有效线性。
  3. 一些基于物理的方法。整合。定义某种最大速度和最大加速度并计算下一个位置(最终夹紧以防止超调和振荡)
  4. PID 控制器。强大的力量,但我总是发现它们很难调整。

也可以考虑使用Vector3.MoveToward,它的实现方式如下:

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;
    }

希望这会有所帮助。

【讨论】:

  • 我一回到我的电脑就会检查这个。感谢您的解释!
  • 感谢非常有用的提示!我考虑了您的想法并实施了一些可行的方法。我还将尝试其他提示以找到最合适的方法。我可能只是在试图弄清楚一些事情时让自己感到困惑,并想出了一个非常复杂但不起作用的解决方案。谢谢你帮我解决这个问题。 :D
猜你喜欢
  • 2022-07-29
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2019-09-17
  • 2013-12-04
相关资源
最近更新 更多