Jak upewnić się, że obracające się obiekty trafiają w cel prawym końcem?

25

Pracuję nad bronią typu nóż do rzucania, w której gracz celuje, a następnie rzuca nożem. Nóż obraca się w powietrzu i przy zderzeniu przestaje się obracać, a rodzice przylegają do przedmiotu, z którym zderzył się. Wirowanie odbywa się za pomocą animacji, podczas gdy ścieżka noża jest obsługiwana przez fizykę.

Jednym z problemów, przed którymi stoję, jest sposób upewnienia się, że gdy nóż zderzy się z wrogiem, nóż będzie skierowany w ich stronę. W tej chwili czasami zdarza się, że nóż najpierw wpada w uchwyt wroga. Co jest oczywiście nierealne. Jednocześnie uważam, że nieuzasadnione byłoby, aby nóż „uderzał” wroga tylko, jeśli najpierw zderzy się z ostrzem, ponieważ szybkość, z jaką nóż się obraca, jest poza kontrolą gracza.

Oglądałem wiele powolnych ujęć kamery podobnej broni i za każdym razem, gdy broń jest rzucana, obraca się w powietrzu i magicznie zawsze kończy się ostrzem skierowanym w cel. W przypadku gry, w której odległość rzucania będzie stała, jest to całkiem proste. Ale nie jestem pewien, jak to przewidzieć, ponieważ wiąże się to z wieloma nieprzewidywalnymi czynnikami, np. kierunek noża, obrót noża, pozycja wroga, odległość od wroga itp. Jeśli to możliwe, wolałbym nie używać skomplikowanej logiki predykcyjnej, ponieważ gra będzie na dość niskich urządzeniach. Czy istnieje sposób na rozwiązanie tego problemu?

Przykład: https://youtu.be/0fav8lFpBko?t=42s

FrontEnd
źródło
15
Nóż zawsze uderzający najpierw w ostrze celu również nie jest realistyczny, szczególnie gdy mówimy o ruchomym celu.
Theraot
1
W zależności od smaku gry istnieje wiele stylów rzucania nożami, które nie obracają ostrza. Zwykle jednak używają noży zaprojektowanych specjalnie do latania w stabilny sposób.
Perkins
jeśli środek masy noża znajduje się znacznie bliżej końca rękojeści niż końca ostrza, a prędkość obrotowa noża jest znacznie większa niż jego prędkość przesuwu, wtedy faktycznie może zawsze trafić w cel ostrzem. byłby to jednak bardzo dziwny nóż i bardzo dziwne stworzenie, które może tak nim rzucić
Sarge Borsch
2
Ten numer jest na tyle widoczny, że jest o nim artykuł TVTropes: The Blade Always Lands Pointy End In
Mason Wheeler
Podoba mi się również rozróżnienie dokonane w pytaniu. Jeśli zmieniłeś obrót na obsługę silnika fizyki, możesz mieć wystarczającą ilość informacji, aby wykonać obliczenia w czasie kolizji, aby sprawdzić, czy koniec noża był wystarczająco dobrze skierowany w stronę celu. Albo to, albo zachowaj animację i po prostu wstępnie upiecz wartości, w których animacje noża są skierowane do przodu, i porównaj bieżącą klatkę animacji, aby zobaczyć, czy jest w tym zakresie, czy nie.
Pysis

Odpowiedzi:

35

Sfałszuj to

Spójrz na połączone wideo, obejrzyj je w zwolnionym tempie ... co to jest? Kamera skacze na końcu, a nóż jest już w hełmie celu.

Po prostu sfałszuj to. Kiedy odległość od noża do celu będzie mała, przeskocz do noża w magiczny sposób w celu.

Edycja: możesz sprawdzić, czy trafi w cel za pomocą zawiłej prognozy, a następnie udawać, że najpierw uderzył w ostrze, a następnie pokazać animację, w której cel się nie porusza, a nóż go zabija.


Skręcona prognoza

ponieważ szybkość obracania się noża jest poza kontrolą gracza.

Zgadza się. Jest poza kontrolą gracza. Jednak nie poza twoją kontrolą ...

Jeśli potrafisz obliczyć odległość, którą musi pokonać nóż, możesz ustawić prędkość obrotu tak, aby nóż najpierw uderzył w ostrze.

Teraz nie ma sensu robić takich prognoz w trakcie lotu, ponieważ nóż musiałby się dostosować, jeśli przeszkoda stanie na przeszkodzie. Dlatego zrobiłbyś to, kiedy rzucasz.

Fakt, że musisz przejść ścieżkę paraboliczną, aby trafić w test, sprawia, że ​​jest to bardziej skomplikowane niż zwykły rzut promieniowy. Sugerowałbym uzyskanie równania dla ruchu parabolicznego, który odpowiada rzutowi nożem, i oceniałem go w określonych odstępach czasu.

Można również znaleźć odległość przeszkody od paraboli, znajdując najbliższy punkt paraboli od pozycji przeszkody, a następnie wykonać kontrolę kolizji z tym punktem.

Gdy dowiesz się, ile ma nóż do przebycia, możesz podzielić go na liczbę całkowitą obrotów, aby najpierw uderzył w ostrze. Edycja: lub liczba całkowita 0,5 w zależności od sposobu rzucania.

Oczywiście przeszkody przesunęłyby się w momencie, gdy nóż się tam znajdzie…


Bądź realistą

100% razy nie sprawisz, że nóż trafi w ostrze, szczególnie przy poruszających się celach. Po prostu przyjmij to, nóż do rzucania nie jest niezawodną bronią. Więc miej alternatywę, aby odbić się, gdy uderzy pierwszy. Możesz sprawdzić, czy najpierw uderzył w uchwyt, sprawdzając jego orientację i porównując go z kierunkiem do punktu kolizji.

Theraot
źródło
1
Ach, nie widziałem skoku, jaki to sprytny, ale taki prosty. To bardzo oczywiste, kiedy oglądałem to klatka po klatce, jak sugerowałeś.
FrontEnd
14

Jeśli wiesz z wyprzedzeniem, gdzie wyląduje nóż - jak w tych filmach z kamerami zabijania, które są zdecydowanie produkowane po fakcie - po prostu oblicz odpowiednią prędkość obrotową na podstawie odległości lotu i liczby pożądanych obrotów. Noże do rzucania pozostawiają najpierw miotacz rzutu, więc musi on obrócić N + 0,5 pełnych obrotów 1 , gdzie N wynosi zwykle co najmniej 1, ale może być bardziej oparty na poziomie umiejętności rzucającego lub jak fajnie chcesz to wyglądać: więcej obrotów = bardziej cool.

Jeśli tego nie zrobisz, możesz oszukiwać, ustawiając obrót przy trafieniu i być może ukrywając go rozpryskiem krwi. Jak magik, jeśli zrobisz to wystarczająco szybko, gracz nie zauważy.

Oczywiście nic z tego nie jest realistyczne. W prawdziwym życiu rzucanie nożem jest naprawdę trudne i wymaga dużo praktyki, jeśli chcesz, aby nóż wylądował jako pierwszy. Rzucający musi być w pełni świadomy odległości i odpowiednio zmienić swój rzut, w przeciwnym razie nóż uderzy najpierw w rękojeść.

1 : Istnieje kilka stylów, w których nóż jest również ostrzem.

congusbongus
źródło
4
+1: rozpryski krwi. Dobre, magiczne sztuczki. Edycja: lub chmura pyłu dla edycji bez krwi.
Theraot
2
@ Theraot i / lub spraw, aby prędkość wirowania była na tyle duża, że ​​widz nie był w stanie dokładnie ustalić, w którą stronę jest skierowany.
Perkins
14
  1. Oblicz odległość linii prostej do celu.

  2. Każda rama ustawia kąt noża na 2PI * (PozostałeStraightLineDistance) / (originalStraightLineDistance) * DesiredNumRotations.

Współczynnik wirowania będzie się nieznacznie różnić, jeśli nóż nie zostanie przesunięty w linii prostej, ale nikt tego nie zauważy.

Jeśli nie określisz z góry celu (tj. Rzucasz i używasz fizyki, aby zobaczyć, co uderza), będziesz musiał to zrobić, ale możesz zastosować tę samą zasadę, patrząc na cel, który może trafić i dostosowując obrót, aby był odpowiedni dla tego celu.

Tim B.
źródło
4

Prawdziwe noże do rzucania są zaprojektowane tak, aby miały bardzo dużą szansę trafienia najpierw ostrzem. Zaprojektuj odpowiednio noże.

Kolekcja noży do rzucania z Wikipedii : Kolekcja noży do rzucania z wikipedii

Chcesz środek masy, a tym samym środek obrotu, jak najdalej od czubka ostrza . Zwiększy to szanse, że ostrze obróci się w pozycję uderzenia, zanim dojdzie do końca rękojeści.

Ostrze jest zazwyczaj długie i cienkie, aby wystawać jak najdalej od środka masy, przy jednoczesnym dodawaniu jak najmniejszej ilości własnej masy. Dodatkowo na końcu rękojeści znajduje się często tarczowa lub sferyczna przeciwwaga, której co ciekawe nie widzę w żadnym z noży z obrazu Wikipedii.

Nóż rzuca się, trzymając końcówkę ostrza i wyginając rączkę w kierunku rzutu.

dotancohen
źródło
2

W przypadku „dymu i luster” można ustawić środek obrotu noża (tj. Środek masy) w pobliżu rękojeści (tj. Części nie spiczastej). W ten sposób, jeśli prędkość obrotowa jest wystarczająco wysoka w porównaniu z prędkością noża, można zagwarantować, że końcówka ostrza zderzy się z celem, a nie z żadną inną częścią.

Do obliczenia jest pewna minimalna prędkość obrotowa, biorąc pod uwagę środek masy i wymiary, ale powinna być prosta. Zauważ też, że nie oznacza to nic o kącie trafienia.

Guido
źródło
1

Idealny miotacz noża?

W tej chwili mówisz, że kręcisz nożem przez animację. Jakiego parametru używasz do sterowania kątem? Numer klatki? Czas gry? Skalowany przez dowolną prędkość wirowania?

Jeśli zamiast tego użyjesz parametru (odległość przesunięta) / (całkowita odległość do celu), z odpowiednim skalowaniem przez pi i (liczba zwojów + 0,5), wtedy nóż rzeczywiście zawsze magicznie dotrze pierwszy.

Neil_UK
źródło
Pierwsza część tego pytania wydaje się wymagać wyjaśnienia. Prawdopodobnie należy to zrobić jako komentarz do pytania. Czy mógłbyś najpierw opracować proponowaną metodę magicznego dotarcia do punktu? Na przykład mówisz „z odpowiednim skalowaniem przez pi”; jakie skalowanie? Można założyć, że jeśli użytkownik będzie musiał zapytać, może nie zrozumieć, jakie byłoby właściwe skalowanie.
Gnemlock,
@ Timim lepiej to wyjaśnił, ale zaproponowane przez Neila rozwiązanie jest dobrym podejściem. Zmodyfikuj szybkość animacji obracającego się noża, aby po osiągnięciu celu nóż był w pozycji „spiczasty koniec przechodzi w drugą osobę”. Jest to o wiele łatwiejsze (do zaprogramowania, ORAZ obliczeniowo) niż obliczanie parabolicznych trajektorii obejmujących poruszanie się celów itp. Jeśli chodzi o „odpowiednie skalowanie według PI”, który prawdopodobnie wynosiłby 2, biorąc pod uwagę, że liczba_revolutions jest inną zmienną w pseudoquacji Neila. Jeśli jest to animacja klatki kluczowej, wystarczy skalować indeks i zapomnieć o pi.
AC