我在堆栈数学网站上发布了这个问题,但他们并不太兴奋,不能看到包括编程在内的问题。无论如何,现在我在这里:)
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。你能在我的方法中发现任何问题吗?
答案 0 :(得分:1)
我看到了几个问题,而且我不确定你选择的方向(至少之前从未见过类似的东西)。
序言:
Vector3.Distance(lerpStart, DesiredPosition)
这是一个常数,是DesiredPosition
周围的半径。
我注意到了一些问题:
问题1
对于距离lerpT
(半径范围外)更远的每个点, MaxDelayDistance
始终> gt = = 1。因此,当某个对象比MaxDelayDistance
更远时,它会立即移至DesiredPosition
。
问题2
DelayRecovery(float)是我的对象移动的秒数 如果达到MaxDelayDistance,则到DesiredPosition。
不确定是否完全理解了你复杂的错误,顺便说一下上面的陈述似乎是错误的。 DelayRecover
总是在考虑尽管距离很远的情况下进行考虑。
问题3
当您关闭DesiredPosition
时,可能会被零除(*
之前评估/
运算符
一些注意事项
我会更多地关注您的代码,并且我会尝试找出背后的逻辑。这是我从未见过的东西。 移动到给定位置的一些通用方法:
还要考虑使用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;
}
希望这有帮助。