一定の速度で移動するCatmull-Romスプラインの弧長を決定する


18

Catmull-Romスプラインの連結によって定義されるパスがあります。XNAの静的メソッドVector2.CatmullRomを使用して、0から1の値を持つポイント間の補間を可能にします。

このパスのすべてのスプラインが同じ長さではありません。これは、パスに沿って進行中にすべてのスプラインに対してウェイトを一定の速度にした場合、速度の違いを引き起こします。重量の速度をスプラインの長さに依存させることで、これを改善できます。このようなスプラインの長さを判断するにはどうすればよいですか?スプラインを10本の直線にカットして、それらの長さを合計するだけで近似できますか?

スプラインによって定義された生成されたメッシュの動的テクスチャマッピングにこれを使用しています。

回答:


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

私たちは、パラメトリック方程式のために、という2年目の計算で学ぶ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本の直線に切断し、その長さを合計する」ことは、これを行う非常に簡単な方法の1つです。ただし、より少ない線分を使用してより正確な結果を得ることができる少し複雑な方法があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.