Utrzymywanie rotacji między dwoma obiektami

9

W mojej grze XNA mam dwa zderzające się obiekty. Kiedy pierwszy przedmiot zderzy się z drugim, może się do niego zaczepić i poruszać po świecie. Mam tutaj problem z matematyką (matematyka nie jest moją mocną stroną). Obecnie mam drugi obiekt, który zatrzaskuje się na pierwszym i poruszam się nim, ale nie mogę go utrzymać, by zachował swój pierwotny kierunek. Tak więc, jeśli obiekt jest skierowany do góry, powinien zachować ten kierunek względem tego, w jaki sposób jest obracany z oryginalnym przedmiotem.

wprowadź opis zdjęcia tutaj

Wszelkie wskazówki, jak najlepiej to osiągnąć?

użytkownik99
źródło
Myślę, że oba obiekty obracałyby się wokół osi środka drugiego obiektu.
MichaelHouse

Odpowiedzi:

3

Jeśli chodzi o kąt, po prostu utrzymuj kąt drugiego obiektu taki sam, jak kąt pierwszego. Aby ustalić pozycję, gdy dwa obiekty zderzają się ze sobą, znajdź odległość drugiego obiektu od pierwszego za pomocą wzoru odległości.

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

Aby znaleźć pozycję drugiego obiektu względem pierwszego obiektu:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)
tesselode
źródło
2

Oprócz odpowiedzi @ tesselode, polecam trzymanie listy dołączonych obiektów dla każdego obiektu świata w grze. Coś w stylu List<WorldObject> AttachedObjects. Następnie, gdy wykryjesz kolizję, dodasz czarny prostokąt do czerwonego AttachedObjects. Następnie wystarczy tylko zaktualizować pozycję dziecka za pomocą metody @ tesselode za każdym razem, gdy aktualizujesz pozycję rodzica.

Jesse Emond
źródło
2

Zakładam, że jeden z nich będzie miał kontrolę nad drugim, podobnie jak podnośnik widłowy. Na twoim rysunku zakładam, że jest to czarny, a czerwony to opakowanie. Wspominasz tylko, że masz problemy z kątami, więc to wszystko, co omówię.

Kiedy obiekty się zatrzasną, powinieneś pamiętać różnicę kątów między nimi (nazywam to Theta). Narysowałem to na rysunku 2 ze strzałkami z pierwszego rysunku narysowanego nad sobą. Dopóki obiekty nie zostaną odblokowane, kąt czerwonego obiektu będzie określony przez kąt czerni plus Theta, jak pokazano na rysunku 3.

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

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

Angle Diff

John McDonald
źródło
1

Możesz zaimplementować możliwość posiadania obiektów potomnych dla obiektu (gdzie na obiekty potomne automatycznie wpływałyby zmiany położenia / obrotu rodzica). Następnie po zderzeniu, kiedy powinny się one zatrzasnąć, tworzysz niewidzialny obiekt i czynisz oba podłączone obiekty jego dziećmi. Następnie zamiast zastosować transformacje (ruch, obrót) do poszczególnych obiektów, zastosujesz je do dużego, LUB nadal możesz zastosować siły do ​​poszczególnych obiektów podrzędnych, co sprawdzi, czy „mam rodzica?”, A jeśli tak, siła zostałaby wysłana do rodzica (który połączyłby siły ze wszystkich obiektów potomnych w jeden wektor, który przyłożyłby do siebie).

Również to podejście powinno właściwie obsłużyć ich obrót, jeśli obliczysz środek masy niewidzialnego rodzica zgodnie z wagami zatrzaśniętych obiektów, czego metoda Johna nie wydaje się osiągnąć (połączone obiekty obracają się wokół nowego wspólnego środka masy, a nie wokół środka masy jednego z obiektów) i można łatwo zagnieździć tego rodzaju zachowanie bez dodatkowego kodu. Wydaje się, że jest to bardziej niezawodne i elastyczne podejście.

+ warunek, jeśli siła przyłożona do dziecka jest wystarczająco silna, aby złamać staw, i można poradzić sobie z jego „odblokowaniem”, po prostu usuwając relację rodzic-> dziecko. Jeśli pozostało tylko jedno dziecko, uczyń je oddzielnym i usuń również niewidzialnego rodzica.

Mogę podać więcej szczegółów (ze zdjęciami i przynajmniej pseudokodem itp.), Jeśli jesteś zainteresowany.

kod sh
źródło