【发布时间】:2015-04-30 14:03:20
【问题描述】:
我在堆栈数学网站上发布了这个问题,但他们并不太兴奋看到包括编程在内的问题。无论如何,现在我在这里:)
- 我有一个对象,它位于 MyTransform.position(矢量)
- 该对象应遵循 DesiredPosition(矢量),即 以不断变化的速度向各个方向移动
- MaxDelayDistance (float) 是允许我的对象的最大距离 必须到达 DesiredPosition。
- DelayRecovery(浮点数)是我的对象移动的秒数 如果达到 MaxDelayDistance,则到 DesiredPosition。
- 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