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

时间:2015-04-30 14:03:21

标签: vector unity3d interpolation

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

  1. 我有一个对象,位于 MyTransform.position (矢量)
  2. 该对象应遵循 DesiredPosition (Vector),即 以变​​化的速度在varius方向上移动
  3. MaxDelayDistance (float)是我的对象允许的最大距离 得到DesiredPosition。
  4. DelayRecovery (float)是我的对象移动的秒数 如果达到MaxDelayDistance,则到DesiredPosition。
  5. Time.deltaTime (float)是我们用来描述最后一个时间的术语 帧更新花了。它的价值通常约为0.025f。
  6. 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。你能在我的方法中发现任何问题吗?

1 个答案:

答案 0 :(得分:1)

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

序言:

Vector3.Distance(lerpStart, DesiredPosition)

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

我注意到了一些问题:

问题1

对于距离lerpT(半径范围外)更远的每个点,

MaxDelayDistance始终> gt = = 1。因此,当某个对象比MaxDelayDistance更远时,它会立即移至DesiredPosition

问题2

  

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

不确定是否完全理解了你复杂的错误,顺便说一下上面的陈述似乎是错误的。 DelayRecover总是在考虑尽管距离很远的情况下进行考虑。

问题3

当您关闭DesiredPosition时,可能会被零除(*之前评估/运算符

一些注意事项

我会更多地关注您的代码,并且我会尝试找出背后的逻辑。这是我从未见过的东西。 移动到给定位置的一些通用方法:

  1. 如果开始和目的地已知并且已修复,则lerping(或ease function)允许准确控制从0到1递增t参数的行程时间。
  2. 如果目的地正在移动,您仍然可以使用lerp平滑跟踪目标(从理论的角度来看,可能不是更正确的使用,也不是物理现实,但无论如何有效)。在这种情况下,Lerp因子是一种朝向目标的速度"。与目标的距离有效地成线性关系。
  3. 一些基于物理的方法。整合。定义某种最大速度和最大加速度并计算下一个位置(最终夹紧以防止过冲和振荡)
  4. PID个控制员。很有力量,但我总觉得很难调整它们。
  5. 还要考虑使用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;
        }
    

    希望这有帮助。