确定Catmull-Rom花键的弧长以恒定速度移动


18

我有一条由Catmull-Rom样条线串联定义的路径。我在XNA中使用静态方法Vector2.CatmullRom,该方法允许在点之间进行插值,值从0到1。

并非该路径中的每个样条曲线都具有相同的长度。如果我沿路径前进时让每个样条的重物以恒定的速度移动,则会导致速度差异。我可以通过使重物的速度取决于花键的长度来对此进行补救。如何确定样条的长度?我是否应该通过将样条线切成10条直线并求和它们的长度来进行近似估算?

我将其用于在样条线定义的生成网格上进行动态纹理映射。

Answers:


25

听起来好像您想在整个曲线上将物体的速度保持在某个恒定值上-知道弧长并不能帮助您做到这一点。它可以帮助您计算如果物体以该速度运动到什么时候会到达终点,因此它会比您现在拥有的更好(物体在所有点之间具有相同的平均速度),但是当物体绕弯道移动时,其实际速度仍会变化。

一个更好的解决办法是改变我们的参数参数(即从0到1,我会打电话的参数s与避免混淆t = time以可变利率ds/dt,它是由速度,你希望对象在被移动确定什么曲线上的那个点。因此,换句话说,不是将s每帧更改为0.01 ,而是将一帧更改为0.005,下一帧更改为0.02,依此类推。

为此,我们计算每帧xdx/ds)和ydy/ds)的导数,然后设置

ds / dt =速度/ sqrt((dx / ds)2 +(dy / ds)2

也就是说,如果我们s以固定的增量进行更改,则采用我们想要的速度,然后除以我们实际要运行的速度。


证明

我们希望物体的速度保持恒定;让我们给该常量命名speed

我们学习第二年的演算,对于参数方程x(s)y(s)

速度= sqrt((dx / dt)2 +(dy / dt)2

我们也了解到

dx / dt = dx / ds * ds / dt     (链式规则)

从而,

速度= sqrt((dx / ds)2(ds / dt)2 +(dy / ds)2(ds / dt)2

求解ds/dt,我们得到了方程式。


计算导数

我从未使用过这些特殊的样条曲线,但我知道它们只是给出x(s)y(s)的三次方程式s。因此,我们可以dx/ds轻松找到导数:

x(s)= a * s 3 + b * s 2 + c * s + e

然后

dx / ds = 3a * s 2 + 2b * s + c

(同为dy/ds当然,你需要知道的确切值ab以及c做到这一点。根据此页面,这些值很容易找到。


最后,要回答标题中的问题:找到参数函数的弧长方程需要求解相当复杂的定积分;即使对于简单的三次方程式,通常也无法做到。

因此,您必须用数字估算积分。 您建议“将样条线切成10条直线并加总其长度”一种非常简单的方法;但是,有些复杂的方法可以使用更少的行段为您提供更准确的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.