Переміщення об'єкта по кривій, обертаючи його


11

Я хотів би перемістити предмет по кривій . У конкретних точках на кривій я хочу, щоб об'єкт міняв швидкість і обертався вздовж своєї осі.

Уявіть собі літак, який летить до пункту призначення. Він має свій шлях, яким він повинен слідувати, а також він регулює свою швидкість та орієнтацію по всьому шляху (заголовок, корка, банк).

Чи можу я просити інформацію про запуск щодо наступного:

  • Які криві використовувати, щоб плавно інтерполювати об'єкт
  • Які формули використовувати для надійної інтерполяції, де я міг би контролювати швидкість переміщення оїти, і перехід між кривими вузлами був би безпроблемним
  • Яку інформацію слід експортувати з програми для 3D-створення
  • Чи варто використовувати для цього кватерніони slerp () ?

Якщо ви знаєте про книгу, яка ефективно висвітлює цю тему , це найбільше б hlep. Дякую.

Відповіді:


7

Для кривої руху я б запропонував використовувати криві Ерміта. Ви просто даєте початкову точку / швидкість і кінцеву точку / швидкість, і це створює приємну і гладку криву між цими двома. Використовуйте кінцеву точку / швидкість першої пари точок як вихідну точку / швидкість наступної пари точок, і у вас є гарна довга і звивиста крива, яка є безшовною.

Це прекрасно справляється з вимогою керувати швидкістю: ви даєте список точок у часі зі швидкістю, яку ви вибрали, і це дає вам плавно інтерпольовані значення позиції та швидкості. Якщо ви хочете піти з цим, все, що вам потрібно отримати з програми 3D-створення, - це точки та швидкості на шляху, який ви бажаєте. Ви також можете їх генерувати під час виконання, можливо, на основі даних користувача.

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

Якщо ви хочете якось «хиткою» орієнтацією, щоб площина іноді відхилялася від напрямку фронту на шляху, ви можете використовувати напрямок фронту як потрібний напрямок, а також послідовно робити однокроковий нахил між поточною орієнтацією та потрібною орієнтацією.

Якщо ви хочете, щоб користувацькі орієнтації не мали нічого спільного з контуром, ви, звичайно, можете надати для цього список кватерніонів орієнтації. Тоді ваші точки стають (точка, швидкість, кватерніон). Тоді ви можете використовувати slerp між двома послідовними кватерніонами, щоб встановити свої орієнтації на цьому шляху. Не забувайте, що серп - це метод лінійної інтерполяції. Однак зазвичай це повинно бути добре. Якщо ви виявите, що обертання недостатньо плавні в швах, ви можете спробувати інтерполювати список кватерніонів з кривою Безьє, як пояснено тут у розділі 7.

Ось декілька вихідних кодів, які можуть допомогти вам розпочати роботу. Він має ряд методів гладкої інтерполяції для списку кватерніонів (загін, безьє тощо).

Повідомте мене, якщо у вас є якісь питання!


+1 - Спасибі, ваша відповідь в основному охоплює все. Він відповідає на кожне запитання, яке я задав, плюс ви надаєте подальший матеріал для вивчення. Тепер у мене є достатньо матеріалу для початку. Тому я не бачу жодної причини, щоб не відзначати це як прийнятий відповідь .
Bunkai.Satori

@ Bunkai.Satori дякую, радий допомогти :) Я хотів би побачити, що ти створюєш врешті-решт.
Газіхан Аланкус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.