【问题标题】:Moving an object along a path with constant speed以恒定速度沿路径移动物体
【发布时间】:2020-05-21 12:55:41
【问题描述】:

我有一个由折线(3D 点数组)组成的对象路径,其中点分布非常不均匀。我需要使用间隔设置为 10 毫秒的计时器以恒定速度移动对象。

不均匀分布的点对人眼产生可变速度。所以现在我需要决定如何处理这个长长的 3D 点数组。

我得到的第一个想法是将长片段细分为更小的部分。它工作得更好,但问题仍然存在。

在这些情况下,最好的方法是什么?另一个想法,可能是使用Ramer–Douglas–Peucker algorithm 简化原始路径,然后再次均匀细分它,但我不确定它是否能完全解决我的问题。

这应该是 3D 图形的许多领域中相当普遍的问题,那么是否存在经过验证的方法?

【问题讨论】:

  • 但是如果物体以恒定速度移动,它不会取决于点之间的距离,不是吗?更多的点只会影响对曲线等“平滑”变化的感知,而不应该影响速度

标签: unity3d opengl graphics 3d directx


【解决方案1】:

我为您制作了一支 JavaScript 笔 https://codepen.io/dawken/pen/eYpxRmN?editors=0010,但它在任何其他语言中都应该非常相似。点击矩形添加点。

您必须以恒定的速度保持与时间相关的distance,如下所示:

const t = currentTime - startTime;
const distance = (t * speed) % totalLength;

然后你必须找到路径中的两个点,使得当前距离介于路径上的“距离”之间;您将 “距路径起点的距离” 存储在每个点 {x, y, distanceFromStart} 上。第一个点points[i] 这样distance < points[i].distanceFromStart 就是您的目的地; points[i - 1] 之前的点是您的来源。您需要在它们之间进行线性插值。

假设你有没有重复点(否则你会被零除)你可以做这样的事情。

for (let i = 0; i < points.length; i++) {
  if (distance < points[i].distanceFromStart) {

    const pFrom = points[i - 1];
    const pTo = points[i];
    const f = (distance - pFrom.distanceFromStart) / (pTo.distanceFromStart- pFrom.distanceFromStart);
    const x = pFrom.x + (pTo.x - pFrom.x) * f;
    const y = pFrom.y + (pTo.y - pFrom.y) * f;
    ctx.fillRect(x - 1, y - 1, 3, 3);
    break;
  }
}

看看这支笔。点击矩形添加点:https://codepen.io/dawken/pen/eYpxRmN?editors=0010

【讨论】:

  • 刚刚偶然发现了其他人制作的关于同一主题的代码笔。我将在这里分享它:codepen.io/kaliedarik/pen/MWadEwm。看起来很酷,有曲线。如果我有时间,我会在这个答案中添加更多关于沿曲线恒速的细节,这是另一个非常有趣的话题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2014-02-17
相关资源
最近更新 更多