Dziura w ziemi
Cel projektu: stworzenie gry wideo 3D z realistyczną fizyką, inspirowanej grą z 2018 roku Donut County. W tej grze gracz steruje dziurą w ziemi, która zwiększa swoje rozmiary za każdym razem, gdy spada do niej przedmiot, a ostatecznie staje się wystarczająco duża, aby pochłonąć całe budynki. To, jak powinna wyglądać gra tutaj.
UWAGA! Wstępny kod został już napisany i dołączony w pliku zip. Uzupełnij kod zgodnie z zadaniem w folderze src, w plikach App.ts i RigidBody.ts, nie zmieniaj istniejącego kodu, jeśli instrukcja tego nie wymaga. Wszystkie wymagania zostały przetłumaczone z angielskiego, mogą występować zniekształcenia.
UWAGA! Użyj lokalnej biblioteki, bez niej gra nie zadziała!
1. Opis gry
Gra została opracowana na podstawie podobnej mechaniki bazowej, co Donut County, chociaż z uproszczoną modelem fizycznym. Użytkownik steruje dziurą za pomocą klawiszy WASD/strzałek, myszy lub ekranu dotykowego, a dziura będzie się powiększać za każdym razem, gdy spadnie do niej obiekt. Na poniższym schemacie przedstawiono system współrzędnych używany w grze. Zauważ, że używamy standardowego układu współrzędnych OpenGL, gdzie +X to prawo, +Y to góra, a -Z to przód.
2. Wymagania
2.1 Sterowanie dziurą
Obecnie użytkownik może poruszać dziurą w nieskończoność w kierunkach X i Z. Dodaj kontrole granic, które nie pozwolą dziurze opuścić strefy gry.
2.2 Ruch sfer
Następnie dokończ kod w klasie RigidBody, aby sfery poruszały się zgodnie z uproszczonym modelem fizycznym:
Ruch: przy implementacji fizyki ciała stałego zmiana pozycji obiektu p obliczana jest przy użyciu jego prędkości v. Dzieje się to w każdej klatce w metodzie update() klasy RigidBody, używając wzoru: p' = p + v * dt.
Grawitacja: ciało stałe powinno przyspieszać w dół z powodu grawitacji, ale powinno to być realistyczne przybliżenie grawitacji. W końcu to gra, w której obiekty spadają do magicznej dziury w ziemi. Wstępny kod zawiera stałą grawitacyjną używaną w przykładzie instruktora.
2.3 Obsługa kolizji na granicy
W każdej procedurze obsługi kolizji są dwa podstawowe kroki: po pierwsze, określenie, czy doszło do kolizji, a po drugie, rozwiązanie kolizji poprzez aktualizację pozycji i prędkości zderzających się obiektów.
Wykrywanie kolizji: Pamiętaj, że w tym typie modelowania aktualizujemy pozycje i prędkości raz na klatkę, a między każdą klatką jest krótki okres czasu (dt). Musimy pamiętać, że czas, w którym dwa poruszające się obiekty się zderzają, prawdopodobnie nie będzie dokładnie wielokrotnością dt. Oznacza to, że ważne jest, aby nie tylko obsługiwać przypadek, gdy dwa obiekty najpierw idealnie się stykają. Ważne jest również, aby obsługiwać przypadek, gdy mogły się właśnie dotknąć przez ułamek sekundy temu. Jest to zilustrowane poniżej. Na kroku czasowym 1 piłka jeszcze nie dotknęła ściany, ale porusza się wystarczająco szybko, aby, jeśli przejdziemy do dt i przejdziemy do kroku czasowego 2, piłka faktycznie przebiła ścianę!
Jeśli aktualizujesz swoją symulację raz w każdej klatce, oznacza to, że upływ czasu (tj. deltaTime lub dt) między kolejnymi klatkami będzie gdzieś w okolicach 1/30–1/60 sekundy. To szybko, ale wciąż niewystarczająco szybko, aby uchwycić dokładny moment, w którym dwa ciała stałe po raz pierwszy się stykają.
Sposób obsługi nerealistycznego zachowania, takiego jak to, polega na jego wykrywaniu i naprawianiu. Z punktu widzenia twojego kodu, wykrywanie kolizji wymaga oceny odległości między dwoma obiektami, i możesz naturalnie napisać sprawdzenie dla tego, używając operatora if, na przykład „if (currentDistanceBetweenObjects == distanceWhenObjectsAreJustTouching)”. W tym przypadku bardzo łatwo jest wykryć sytuację, taką jak Timestep 2, po prostu zmieniając „==" w swoim operatorze if na „<=”.
Aktualizacja pozycji: aby naprawić te sytuacje, musisz ustawić pozycję sfery na nową wartość, przy której nie będzie ona przenikać do innego obiektu. Istnieje kilka dopuszczalnych podejść w zależności od tego, jak dokładni chcesz być w obliczeniach. Dla granic strefy gry zalecamy ustawienie pozycji sfery na najbliższą dopuszczalną pozycję, co można osiągnąć, przesuwając sferę w kierunku prostopadłym do ściany, która została przekroczona. Na przykład, jeśli odkryłeś, że pozycja sfery w osi X jest zbyt duża, po prostu ustaw jej pozycję w osi X na najbliższą dopuszczalną wartość. Dla kolizji między dwiema sferami zalecamy obliczenie najkrótszej odległości, którą sfery muszą pokonać, aby już nie przenikały do siebie, a następnie przesunięcie każdej sfery o połowę tej odległości. Omówimy te obliczenia i różne alternatywy w klasie.
Aktualizacja prędkości: gdy ciało stałe odbija się od innego obiektu, jego prędkość v zmienia się, ale jak? To zależy od normalnej powierzchni, z którą się stykają. Na następnym rysunku przedstawiono sferę odbijającą się od płaszczyzny ziemi. W tym przypadku obliczenie aktualizacji prędkości sfery jest bardzo proste; po prostu negujemy v.y, pozostawiając v.x i v.z bez zmian.
Przybliżenie tarcia: aby zasymulować tarcie, można po prostu zmniejszyć prędkość ciała stałego, gdy uderza w coś. Na przykład, można pomnożyć aktualną prędkość przez 0,9 po odbiciu, co spowolni ją o 10% z powodu tarcia. Wstępny kod już zawiera parametr spowolnienia tarcia, używany w przykładzie.
2.4 Obsługa kolizji sfera-sfera
Podsumowując, dla przypadku sfera-sfera kroki będą następujące:
1. Określ, że dwie sfery się zderzyły (i prawdopodobnie przeniknęły do siebie).
2. „Napraw” kolizję, dostosowując pozycje obu sfer, aby już się nie przecinały.
3. Dla każdej sfery oblicz jej nową prędkość po kolizji, nie zapominając użyć odpowiedniej normalnej kolizji i względnej prędkości.
Na koniec nieco zmniejsz prędkość każdej sfery, aby uwzględnić tarcie.
Warto wspomnieć o upraszczających założeniach: oprócz uproszczonej grawitacji i tarcia nasze podejście zakłada, że te sfery mają tę samą masę, więc nie musimy rozwiązywać równań zachowania pędu, chociaż możesz to zrobić, aby uzyskać bardziej realistyczną symulację. Ponadto nie rozważamy przypadków, gdy w jednej klatce zderza się więcej niż dwa obiekty. Czasami z tego powodu możesz zobaczyć artefakt w swojej symulacji. Możliwe, ale to wykracza poza to zadanie, aby obsługiwać wszystkie te przypadki.
2.5 Stwórz swoją własną grę
W ostatniej części powinieneś dodać kod do metody startNextStage(), aby stworzyć własną scenę, która zostanie załadowana po tym, jak użytkownik zakończy scenę testową. Masz dużą swobodę w tworzeniu własnej gry, pod warunkiem, że spełnia te minimalne wymagania:
Twoja gra powinna zawierać co najmniej 8 ciał stałych.
Każde ciało stałe powinno różnić się rozmiarem.
Aby wygrać w grze, najpierw musisz pochwycić kilka mniejszych ciał stałych, aby dziura stała się wystarczająco duża, aby pochwycić większe ciała stałe.
Ciała stałe powinny się poruszać, aby gra była interesująca. Co najmniej można je zainicjować losowymi prędkościami, ale możesz również zrobić coś bardziej kreatywnego tutaj, na przykład zbudować maszynę Rube'a Goldberga. lub ułożyć je w formie jakiejś zagadki.
Załączniki 4
Opinia zleceniodawcy o współpracy z Pavel Shevchuk
Dziura w ziemiŚwietna współpraca, responsywność i terminowość. Projekt działa przy przestrzeganiu instrukcji. Projekt był skomplikowany, OOP z trudnymi obliczeniami matematycznymi, Paweł poradził sobie ze wszystkimi zadaniami doskonale
Opinia freelancera o współpracy z Sofya K.
Dziura w ziemiBardzo dobre tzw. Dobra komunikacja. Polecam współpracę
-
Oferta, która wygrała3 dni255 PLN
729 10 0 Oferta, która wygrała3 dni255 PLNGotowy do ukończenia pracy. Mam doświadczenie w pracy z złożoną aplikacją OOP, która wymaga dużo matematyki.
https://cad.emachineshop.com/#/share/GeMIcbY7UhRKQKfgjsFeTBAcRgSAHAl42J0Lclg6
Aktualne zlecenia dla freelancerów w kategorii Javascript & Typescript
Sklep internetowy z odzieżąPotrzebny programista do sklepu internetowego z odzieżą Szukam doświadczonego programisty do stworzenia pełnoprawnego sklepu internetowego z odzieżą z modelem sprzedaży dropshipping. Co należy zrobić: 6 stron: strona główna, produkt, koszyk, zamówienie, konto, panel… Układ HTML i CSS, Javascript & Typescript ∙ 1 dzień 12 godzin temu ∙ 82 oferty |
Full-stack rozwój — Amazon PPC Dashboard (Etap 1)Potrzebny programista full-stack z doświadczeniem w pracy z Amazon API do realizacji Etapu 1 wewnętrznego dashboardu PPC. Projekt realny, dane żywe, wszystko gotowe do startu. Prototyp frontendu (5 stron, React + TypeScript): CO JUŻ GOTOWE — Prototyp frontendu na React 18 +… Javascript & Typescript, Programowanie stron internetowych ∙ 3 dni 23 godziny temu ∙ 30 ofert |
Opracowanie strony internetowej do tworzenia fotoksiążek i ram fotowychCel projektuNależy opracować nowoczesną stronę internetową do zamawiania fotoksiążek, ram fotowych i innych spersonalizowanych produktów fotograficznych.Głównym celem projektu jest umożliwienie klientowi samodzielnego stworzenia gotowego projektu produktu bez udziału projektanta… Javascript & Typescript, Programowanie stron internetowych ∙ 5 dni 15 godzin temu ∙ 98 ofert |
Zespół do samodzielnie stworzonej platformy rynkowej usług pogrzebowych.Poszukujemy zespołu do uruchomienia i rozwoju autorskiej krajowej platformy rynkowej usług pogrzebowych. Od razu: nie szukamy pojedynczych osób, juniorów ani "zbieraczy stron". Potrzebny jest silny zespół produktowy na poziomie middle+/senior z rzeczywistymi przypadkami… Javascript & Typescript, Programowanie stron internetowych ∙ 6 dni 10 godzin temu ∙ 27 ofert |
Dopracowanie istniejącego projektu Next.js/Supabase: oferty, CRM, analityka, czat AIIstnieje działający projekt WatchGenius — platforma analityczna luksusowych zegarków z katalogiem modeli, analizą cen, zewnętrznymi ofertami, formularzami zgłoszeniowymi i czatem AI. Projekt został już częściowo opracowany. Potrzebny jest doświadczony programista full-stack,… Javascript & Typescript, Programowanie stron internetowych ∙ 8 dni 11 godzin temu ∙ 55 ofert |