Jak wdrożyć wykrywanie kolizji portali?

12

Na przykład weźmy ten scenariusz (przepraszam za moje okropne umiejętności rysowania): wizerunek

Opiera się to na „portalu”, w którym stickman przechodzi przez niebieski portal (który jest połączony z czerwonym portalem), ale na czerwonym portalu jest ściana. Dlatego nie może przejść całkowicie przez portal.

Moje pytanie brzmi zatem: w jaki sposób przeprowadzam z nimi wykrywanie fizyki / kolizji? Czy kroję odtwarzacz? Czy istnieje sposób na ich połączenie? Czy są jakieś silniki fizyki, które to potwierdzają? Jeśli nie, jak mam to zrobić?

MiJyn
źródło
O ile mi wiadomo, wyjaśniają niektóre rzeczy w komentarzu dewelopera do Portalu 1.
Archy
@ Byte56, dzięki, zaktualizowałem swój post. Myślę, że to powinno wyjaśnić to bardziej :)
MiJyn
1
Myślę, że sytuacja, którą opisujesz, jest bardzo rzadka w portalu (jeśli to się zdarzy), ponieważ portale nie są swobodnym miejscem docelowym. Są umieszczane na ścianach i tylko na określonych ścianach. Nie przypominam sobie sytuacji, w której mogłem umieścić portal, ale nie byłem w stanie przejść przez niego z powodu przeszkody na drugim końcu portalu. Wyobrażam sobie, że możesz utworzyć tymczasową kopię odtwarzacza w obu lokalizacjach na okres przejściowy.
MichaelHouse
2
@ Byte56: Nie pamiętasz wiele. Pamiętam, jak to zrobiono w Portalu 1. Wydaje mi się, że przypominam sobie miażdżący obszar, w którym można by użyć portalu, aby uniknąć śmierci. Kolizje z przedmiotami w pobliżu portali są częstym zjawiskiem, a silnik łatwo sobie z nimi radzi.
Nicol Bolas,

Odpowiedzi:

7

Portal gra ma ładny drogę, którą oni rozwiązać ten problem:

Gracz przebija portal źródłowy (niebieski) i widać, że wystaje z portalu docelowego (pomarańczowy). Gracz zostanie skopiowany do portalu docelowego i przejdzie przez niego. Gra renderuje obraz widziany podczas przeglądania portalu źródłowego za pomocą drugiej kamery i renderowania do tekstury.

Jednak kopia gracza w docelowej lokalizacji nie wchodzi w interakcje z fizyką. Jest tylko do celów renderowania. Zamiast tego tworzą wirtualne obiekty kolizji po drugiej stronie portalu źródłowego i zamiast tego powodują zderzenie odtwarzacza. Dzięki temu fizyka jest prosta.

Potrzebujesz tylko tych wirtualnych obiektów, o ile gracz może dotrzeć, nie wchodząc całkowicie przez portal. Gdy tylko gracz w pełni przejdzie przez portal, sytuacja się odwraca.

Obraz ilustrujący : Portal niebieski to portal źródłowy, portal pomarańczowy - portal docelowy. Przerywana biała ramka to wirtualny obiekt kolizyjny, natomiast rzeczywista ramka to obiekt renderowany. Gracz (z czerwoną kropką) oddziałuje tylko z otaczającymi go obiektami. Obiekty w pomarańczowym portalu są całkowicie ignorowane.

wprowadź opis zdjęcia tutaj

Daniel AA Pelsmaeker
źródło
4
za pomocą drugiej kamery i renderowania do tekstury ” Komentarz twórców portalu 1 wyraźnie powiedział, że nie używają renderowania do tekstury, ponieważ nie działało to dobrze dla ich potrzeb (szczególnie w przypadku wyświetlania portali z innych portali ). Zamiast tego zasadniczo przekształcają wersję świata na drugą stronę portalu i po prostu ponownie ją renderują.
Nicol Bolas,
Wow, to odpowiada prawie na wszystko! Zastanawiam się tylko, czy portal działa jako dziura z przedmiotami w środku?
MiJyn
6

Oto jak spróbuję to zrobić.

Gdy jesteś w portalu, w silniku fizyki byłyby dwie kopie odtwarzacza. Każda kopia ignoruje wszystkie kolizje po przeciwnej stronie portalu, a następnie łączysz wyniki i stosuje wyniki symulacji do obu modeli.

Idealnie byłoby zastosować grawitację osobno dla każdej połowy gracza, ale możesz uciec, stosując ją tylko z boku portalu, na którym znajduje się środek masy gracza.

Aby zignorować te kolizje, musisz ustawić odpowiedni wolumin i sprawdzić, czy w nim jest punkt. Dobrym rozwiązaniem wydaje się cylinder (prawdopodobnie rozciągnięty pionowo). Test jest więc podobnyif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();

Wierzę, że większość silników fizyki ma system filtrowania, z czym obiekt może się zderzyć, więc powinno to być możliwe przy użyciu standardowego silnika fizyki. Na przykład http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering

Aby połączyć wyniki, najprostszą opcją byłoby prawdopodobnie dodanie jakiegoś nieelastycznego ograniczenia między nimi i pozwolenie silnikowi fizyki sobie z tym poradzić.

Adam
źródło
Hmm, dobrze, jak bym to zrobił? Mam część dotyczącą kopiowania odtwarzacza, ale poza tym nie mam pojęcia. Jak zignorować kolizje z przeciwnej strony? Jak w ogóle połączę wyniki?
MiJyn
Zredagowałem kilka szczegółów.
Adam
dzięki, pomyślę o tym i odpowiem później, kiedy tylko będę mógł to ustawić prosto w mojej głowie :)
MiJyn
Wielkie dzięki, twoja odpowiedź i odpowiedź Virtlink na moje pytanie :) Teraz zdecyduj, która z nich ma ustawić „prawidłową odpowiedź” na ...
MiJyn
4

Jak obliczyć, jak daleko schodzi gracz?

Dlaczego miałbyś chcieć Nie musisz obliczać, jak daleko gracz idzie w dół; dowiesz się, jak daleko schodzi, gdy obiekt przechodzi przez symulację.

Jak mógłbym nawet połączyć portale?

Portal, z perspektywy samej gry, to niewiele więcej niż skomplikowany teleporter, który miesza się z kolizją, zamieniając kolidujące obiekty w kolidujące. Kiedy obiekt dotyka portalu, zaczyna potencjalnie kolidować z rzeczami po drugiej stronie. Kiedy obiekt mija portal „wystarczająco daleko”, skutecznie teleportujesz go do drugiego, natychmiast zmieniając jego położenie i orientację.

Fizyka po prostu działa normalnie.

Nicol Bolas
źródło
When an object touches the portal, it starts potentially colliding with things on the other sidetak, dokładnie. Jak miałbym to zrobić z silnikiem fizyki? To chyba moje pytanie :)
MiJyn
@MiJyn: Piszesz silnik fizyki, który potrafi to zrobić. Valve musiała zasadniczo zepsuć silnik Source, aby Portal rzeczywiście działał. Żaden komercyjny lub open-source silnik fizyki nie jest w stanie tego zrobić. Jest powód, dla którego pomimo popularności portalu, na rynku nie ma wielu klonów portalu.
Nicol Bolas,
ciekawe, ponieważ istnieje wiele innych gier, które mają bardzo podobną mechanikę (zobacz nawet mod TARDIS do Minecrafta). Jestem pewien, że musi być jakiś sposób, aby to zrobić z łatwością.
MiJyn