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