Проведення обертання між двома об'єктами


9

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

введіть тут опис зображення

Будь-які поради, як я міг найкраще цього досягти?


Я думаю, що обидва об'єкти обертаються навколо осі центру іншого об’єкта.
MichaelHouse

Відповіді:


3

Що стосується кута, просто тримайте кут другого об'єкта таким же, як і кут першого. Для положення, коли два об'єкти стикаються один з одним, знайдіть відстань другого об'єкта від першого за допомогою формули відстані.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Щоб знайти положення другого об'єкта відносно першого об’єкта:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

Окрім відповіді @ tesselode, я б рекомендував вам зберігати список доданих об’єктів для кожного світового об’єкта у вашій грі. Щось по лінії List<WorldObject> AttachedObjects. Потім, коли ви виявите зіткнення, ви додасте чорний прямокутник до червоного AttachedObjects. Після цього залишається лише оновити позиції дітей за допомогою методу @ tesselode кожного разу, коли ви оновлюєте позицію батьків.


2

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

Коли об'єкти фіксуються разом, ви повинні пам’ятати різницю кутів між двома (я називатиму це Тетою). Я намалював це на малюнку 2 стрілками з першої фігури, намальованої одна над одною. Поки об’єкти не будуть розкритими, кут червоного об'єкта визначатиметься кутом Чорного плюс Тета, як показано на рисунку 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Кутова різниця


1

Ви можете реалізувати можливість мати дочірні об’єкти для об'єкта (де дочірні об’єкти автоматично впливали б на зміни положення / обертання батьків). Тоді після зіткнення, коли вони повинні зафіксуватися разом, ви робите невидимий предмет і робите обидва доданих предмета його дітьми. Тоді, замість того, щоб застосовувати перетворення (рух, обертання) на окремих об'єктах, ви застосовуєте їх на великому, АБО ви все-таки можете застосувати сили до окремих дочірніх об'єктів, які б перевіряли "чи маю я батьків?", І якщо так, сила буде спрямована на батьківську (яка злила б сили з усіх дочірніх об'єктів в один вектор, який він застосував би до себе).

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

+ умова, якщо сила, прикладена до дитини, є достатньо сильною, щоб розірвати суглоб, і ви можете впоратися з його розкручуванням, просто усунувши стосунки батьків -> дитини. Якщо залишилася лише одна дитина, ви також зробите її окремо і видалите також невидимого батька.

Я можу надати більше деталей (із зображеннями та принаймні псевдокодом та іншими), якщо вам цікаво.

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