Na przykład weźmy ten scenariusz (przepraszam za moje okropne umiejętności rysowania):
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ć?
Odpowiedzi:
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.
źródło
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 podobny
if (!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ć.
źródło
Dlaczego miałbyś chcieć Nie musisz obliczać, jak daleko gracz idzie w dół; dowiesz się, jak daleko schodzi, gdy obiekt przechodzi przez symulację.
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.
źródło
When an object touches the portal, it starts potentially colliding with things on the other side
tak, dokładnie. Jak miałbym to zrobić z silnikiem fizyki? To chyba moje pytanie :)