Łączenie symulacji fizycznych z różnymi układami współrzędnych

9

Chcę, aby obiekty przemieszczały się między dwiema symulacjami fizyki przez „okno” i kolidowały z tymi z obu symulacji w przypadku przecięcia płaszczyzny okna.

Układy współrzędnych symulacji nie mają tego samego początku i mogą mieć inną orientację. Zawijanie symulacji do siebie nie jest konieczne, ale byłoby plusem.

Jak skutecznie połączyć systemy bez klonowania poszczególnych obiektów?

Edytować:

Obliczenia powinny być tak dokładne, jak to możliwe, aby obiekty nie utknęły, jeśli jednocześnie przechodzą przez okno z przeciwnych stron.

Tamschi
źródło
Pierwsze pytanie brzmi: czy symulacja fizyczna ma być dokładna przez okno? Ponieważ zmiany orientacji uniemożliwiają prawidłowe przemiatanie. To trochę jak zmieniające się portale - świat możliwego bólu. Drugie pytanie: inna orientacja, jak w przypadku dowolnych lub co najmniej pod kątem 90 stopni, tylko zamiana osi?
Kaj,
To brzmi jak problem, który musieli rozwiązać w portalu. Jeśli dobrze pamiętam, wspominają o tych problemach i o tym, jak je rozwiązali w niektórych komentarzach w grze. Prawdopodobnie można je gdzieś znaleźć online.
Nailer
@Kaj Myślę, że najlepiej byłoby podzielić ścieżkę obliczeń dla przejść dowolnych i pod kątem prostym. W ten sposób prostopadłe mogłyby mieć większą precyzję i prędkość, podczas gdy inne kąty byłyby również możliwe.
Tamschi,
@Nailer Jeśli dobrze pamiętam, stworzyli nowe środowisko fizyki podczas otwierania portalu, a następnie sklonowali każdy obiekt fizyki, który zbliżył się do tej dodatkowej symulacji. Powiedzieli, że w jakiś sposób ograniczają obiekty, ale najprawdopodobniej po prostu przekształcają siły i ustawiają każdy krok fizyczny. <br> Jestem pewien, że stworzą trzeciego klona w miejscu docelowym z powodu sposobu, w jaki ruch gracza jest symulowane w źródle.
Tamschi,

Odpowiedzi:

2

Jest ten fajny projekt o nazwie Pseudoform, wcześniej znany jako „Portalized”, który obsługuje symulacje fizyki przy użyciu portali w sposób groovie:

Pseudoform

Sprawdź to!

Zwłaszcza filmy - jest niesamowicie fajne.

Jest to oprogramowanie typu open source, więc możesz zobaczyć, jak to robią.

Założę się, że tego właśnie chcesz. :)

jacmoe
źródło
2
Właśnie przeczytałem kod: sposób, w jaki to robią, jest prawie podobny do rozwiązania Valve, ale bez dodatkowego środowiska fizyki. Portale w mechanizmie Portalized tworzą duplikat obiektu, gdy dotyka on powierzchni portalu, a następnie usuwają go, gdy opuści portal przez określony czas. Ta odpowiedź jest nadal nieco pomocna: złącze użyte do ograniczenia duplikatów pokazuje, jak obiekt jest transformowany w portalu.
Tamschi,
0

Okej - nie wiem czy to zadziała.
Na podstawie powyższych informacji umieściłbym wyzwalacze w „oknach”, aby móc wykryć, kiedy obiekt wychodzi ze świata. Weź wektor prędkości prądu w chwili zderzenia. Oblicz pozostały czas na podstawie tego, gdzie uderzył w wyzwalacz i gdzie skończył się w tej ramce (poza światem twój świat potrzebuje wirtualnej granicy, aby to umożliwić). W tym momencie znasz prędkość i pozostały czas, więc możesz zmienić jej położenie na granicy świata, do którego ma zamiar wejść, i zmienić prędkość. Wymagałoby to jednak dwóch aktualizacji fizyki w jednej ramce, a jeden obiekt przechodzi od a do b, podczas gdy inny przechodzi od b do a w tej samej pozycji - w ogóle nie wykryłoby się kolizji.
Trochę szkicowy,

Kaj
źródło
Wydaje się, że jest to najszybszy możliwy sposób, ale istnieje problem, jeśli dwa obiekty przechodzą przez okno z tej samej strony: jeśli pierwszy obiekt utknie w połowie drogi przez granicę, drugi nie zderzy się, dopóki nie osiągnie granicy, i pojawią się wewnątrz pierwszego miejsca docelowego.
Tamschi,
Zrobiłem niewielką edycję podczas pisania, a to był rzeczywiście problem, który dodałem: o \
Kaj
Muszę nauczyć się czytać. Mój dodatek był inną sprawą graniczną. Zastanowi się.
Kaj,
Nie, granica jest poza światem. Tak więc obiekt pierwszy zostałby wystrzelony w świat 2 (od granicy świata 2 - nie w pozycji okna) z własną prędkością, podobnie jak obiekt b. Zderzyliby się właściwie w świecie 2 na granicy… Myślę, że: o? Jednak moja własna sprawa graniczna nadal obowiązuje.
Kaj,
Wygląda na to, że źle odczytałem część dotyczącą wirtualnej granicy. W każdym razie istnieje inny problem, jeśli obiekt utknie. Część z tyłu okna docelowego nadal będzie renderowana w pierwotnej pozycji, ale obiekty, które nie dotykają ramki, nie zderzą się z nią. Jednym ze sposobów rozwiązania tych problemów byłoby ujednolicenie symulacji, ale nie jestem pewien, jak można to zrobić skutecznie.
Tamschi,
0

Przeczytałem kilka informacji na temat symulacji fizyki i znalazłem możliwe rozwiązanie. Działa poprzez podzielenie każdego kroku fizyki na trzy fazy:

1. Krok wstępny:

W każdym kroku fizyki okno tworzy cztery transformacje, po dwie dla każdej strony połączenia:

  • transformacja wejściowa, która przekształca pozycję obiektu, prędkość (oraz ewentualnie rozmiar i wagę) w docelowy układ współrzędnych i
  • transformacja wyjściowa, która przekształca siły z powrotem w oryginalny system obiektu.

(Okna statyczne muszą to zrobić tylko raz).

Ponadto obiekty w każdym układzie współrzędnych są podzielone na trzy grupy:

Grupowanie fizyki http://content.wuala.com/contents/Tamschi/Stack%20Exchange/WindowGrouping.png

  1. Obiekty przed oknem (zielone).
    Obiekt zaliczany jest również do tej grupy, jeśli przecina płaszczyznę okna lub prawdopodobnie przekroczy ją zza okna (nie pokazano).

  2. Obiekty przecinające okno lub które prawdopodobnie przecinają je w tym kroku fizyki (pomarańczowy).

  3. Obiekty za oknem (niebieskie). Jeśli obiekt leci w kierunku tylnej części okna, nadal jest oznaczony jako członek grupy trzeciej.

Grupowanie można uprościć, jeśli okno znajduje się na granicy symulacji.

2. Główny krok:

Fizykę oblicza się głównie jak zwykle, z kilkoma wyjątkami:

  • Obiekty z drugiej grupy nigdy nie kolidują z obiektami z trzeciej grupy i odwrotnie.

  • Transformacja wejściowa okna jest wykorzystywana na obiektach z drugiej grupy, a wyniki są oceniane w stosunku do przednich i przecinających się obiektów z systemu docelowego. Powstała siła jest przekształcana za pomocą transformacji wyjściowej i przykładana do oryginalnego obiektu.

(Jeśli obiekt zostanie trafiony podczas obliczeń, należy go przegrupować!)

3. Po kroku:

Jeśli obiekt z drugiej grupy przekroczył okno, jest przenoszony do systemu docelowego za pomocą transformacji wejściowej.

Dodatkowe przemyślenia:

Jeśli transformacje zostaną zachowane po obliczeniu fizyki, można je wykorzystać do przyspieszenia renderowania i dla łatwiejszych obliczeń AI. Grupowania można użyć do usunięcia płaszczyzn klipu z procesu renderowania.

Minusem tego rozwiązania jest to, że okna należy dodawać bezpośrednio do silnika fizyki.

Tamschi
źródło