Визначте довжину дуги сплайну Catmull-Rom, щоб рухатися зі сталою швидкістю


18

У мене є шлях, який визначається конкатенацією сплайнів Catmull-Rom. Я використовую статичний метод Vector2.CatmullRom в XNA, який дозволяє здійснювати інтерполяцію між точками зі значенням, що йде від 0 до 1.

Не кожен сплайн на цьому шляху має однакову довжину. Це спричиняє різницю швидкості, якщо я відпускаю вагу з постійною швидкістю для кожного сплайну, продовжуючи шлях. Я можу виправити це, дозволяючи швидкості ваги залежати від довжини шпонки. Як я можу визначити довжину такого сплайна? Чи варто просто наблизити, розрізавши сплайн на 10 прямих і підсумовуючи їх довжини?

Я використовую це для динамічного відображення текстури на створеній сітці, визначеній сплайнами.

Відповіді:


25

Це здається, що ви хочете тримати швидкість об єкта на деякому постійному значенні по всій кривій - знаючи довжину дуги не допоможе вам це зробити. Це допоможе вам обчислити, в який час об’єкт досяг своєї кінцевої точки, якби він рухався з такою швидкістю, тож це буде краще, ніж у вас зараз (об’єкт матиме однакову середню швидкість між усіма точками), але фактична швидкість об'єкта все ще буде змінюватися в міру його переміщення по кривій.

Кращим рішенням було б змінити наш параметричний параметр (параметр, який переходить від 0 до 1, який я закликаю, sщоб уникнути плутанини t = time) із змінною швидкістю ds/dt, яка визначається якою швидкістю ви хочете, щоб об'єкт рухався з що точка на кривій. Отже, іншими словами, замість того, щоб змінювати sпо 0,01 кожен кадр, ми можемо змінити його на 0,005 одного кадру, 0,02 наступного тощо.

Ми робимо це, обчислюючи похідні x( dx/ds) і y( dy/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) Звичайно, вам потрібно знати точні значення a, bі cзробити це. Відповідно до цієї сторінки , ці значення легко знайти.


Нарешті, щоб відповісти на запитання у заголовку: пошук рівняння довжини дуги параметричної функції передбачає розв’язання досить складного визначеного інтеграла ; Навіть для простого випадку кубічного рівняння це взагалі неможливо зробити.

Таким чином, вам доведеться оцінити інтеграл чисельно . "Розрізання сплайну на 10 прямих і підсумовування їх довжин", як ви пропонуєте, це один дуже простий спосіб зробити це ; однак, є трохи складніші методи, які дадуть вам набагато більш точні результати, використовуючи менше рядкових сегментів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.