Come assicurarsi che gli oggetti rotanti colpiscano un bersaglio con l'estremità giusta?


25

Sto lavorando a un'arma a coltello da lancio in cui un giocatore mira e poi lancia un coltello. Il coltello gira in aria e in caso di collisione smette di girare e si accoppia all'oggetto con cui si è urtato. La rotazione viene gestita tramite l'animazione mentre il percorso del coltello è gestito dalla fisica.

Un problema che sto affrontando è come assicurarsi che quando il coltello si scontra con un nemico che il coltello sarà rivolto verso di loro. Al momento ciò che accade a volte è che il coltello si inserisce per primo in una maniglia nemica. Il che è ovviamente irrealistico. Allo stesso tempo, penso che sarebbe abbastanza irragionevole per il coltello "colpire" il nemico solo se si scontrasse prima con la lama, poiché la velocità con cui il coltello gira è al di fuori del controllo del giocatore.

Ho guardato un sacco di riprese lente di killcam di armi simili e ogni volta che l'arma viene lanciata gira in aria e magicamente finisce sempre con la lama che punta verso il bersaglio. Per un gioco in cui la distanza di lancio sarà costante, questo è abbastanza semplice da fare. Ma non sono del tutto sicuro di come prevederlo poiché ci sono molti fattori imprevedibili coinvolti, ad es. direzione del coltello, rotazione del coltello, posizione del nemico, distanza dal nemico ecc. Se possibile, preferirei non dover usare una logica di previsione complessa poiché il gioco sarà per dispositivi di fascia bassa. Esiste un modo "fumo e specchi" per risolvere questo problema?

Esempio: https://youtu.be/0fav8lFpBko?t=42s


15
Anche il coltello che colpisce sempre prima una lama non è realistico, in particolare quando parliamo di un bersaglio in movimento.
Theraot,

1
A seconda del sapore del gioco, esistono diversi stili di lancio del coltello che non fanno girare la lama. Di solito usano coltelli appositamente progettati per volare in modo stabile.
Perkins,

se il centro di massa del coltello è significativamente più vicino all'estremità dell'impugnatura piuttosto che all'estremità della lama, e la velocità di rotazione del coltello è molto maggiore della sua velocità di spostamento, allora potrebbe effettivamente colpire sempre il bersaglio con la lama. sarebbe comunque un coltello molto strano e una creatura molto strana che potrebbe lanciarlo in quel modo
Sarge Borsch

2
Questo numero è abbastanza importante da contenere un articolo su TVTropes: The Blade Always Lands Pointy End In
Mason Wheeler

Mi piace anche la distinzione fatta nella domanda. Se hai commutato la rotazione in modo che sia gestita anche dal motore fisico, potresti avere informazioni sufficienti per fare un calcolo al momento della collisione per vedere se l'estremità del coltello era rivolta abbastanza bene sul bersaglio o no. O quello, o mantieni l'animazione, e semplicemente pre-cuocere i valori in cui le animazioni del coltello puntano in avanti e confronta il fotogramma di animazione corrente per vedere se si trova all'interno di quell'intervallo o meno.
Pysis

Risposte:


35

Fingi

Guarda il video che hai collegato, guardalo al rallentatore ... eh, che cos'è? La telecamera salta alla fine e il coltello è già nel casco del bersaglio.

Fallo e basta. Una volta che la distanza tra il coltello e il bersaglio è piccola, salta magicamente sul coltello nel bersaglio.

Modifica: puoi verificare se colpirà un bersaglio usando la previsione contorta, quindi fai finta di aver colpito prima la lama, quindi mostra un'animazione in cui il bersaglio non si muove e il coltello lo uccide.


La previsione contorta

poiché la velocità con cui il coltello gira è al di fuori del controllo del giocatore.

È giusto. È al di fuori del controllo del giocatore. Tuttavia, non al di fuori del tuo controllo ...

Se riesci a calcolare la distanza che il coltello deve percorrere, puoi fare la velocità di rotazione in modo tale che il coltello colpisca per primo la lama.

Ora, non ha senso fare questa previsione a metà volo, perché il coltello dovrebbe adattarsi se un ostacolo si frappone. Pertanto, lo faresti quando lanci.

Il fatto che devi seguire un percorso parabolico per raggiungere il test lo rende più complicato di un semplice cast ray. Suggerirei di ottenere l'equazione per il movimento parabolico corrispondente al lancio del coltello e di valutarla a intervalli prestabiliti.

È anche possibile trovare la distanza degli ostacoli dalla parabola, trovando il punto più vicino nella parabola alla posizione dell'ostacolo, quindi eseguire un controllo delle collisioni con quel punto.

Una volta che sai quanto deve percorrere il coltello, puoi dividerlo in un numero intero di rotazioni, in modo che colpisca per primo la lama. Modifica: o un numero intero 0,5 a seconda di come si lancia.

Certo, gli ostacoli si sarebbero mossi dal momento in cui il coltello arriva lì ...


Sii realista

Non farai colpire la lama con il coltello il 100% delle volte, in particolare con bersagli in movimento. Abbraccialo e basta, un coltello da lancio non è un'arma affidabile. Quindi avere l'alternativa di farlo rimbalzare quando colpisce per primo. È possibile verificare se ha colpito prima la maniglia controllandone l'orientamento e confrontandolo con la direzione rispetto al punto di collisione.


1
Ah, non ho visto il salto, quanto intelligente ma così semplice. È molto ovvio quando l'ho visto fotogramma per fotogramma come mi hai suggerito.
FrontEnd

14

Se sai in anticipo dove atterrerà il coltello - come in quelle riprese di kill cam, che è sicuramente prodotto dopo il fatto - basta calcolare la giusta velocità di rotazione in base alla distanza di volo e al numero di rotazioni desiderate. I coltelli da lancio lasciano per primo il lanciatore, quindi deve ruotare N + 0,5 rotazioni complete 1 , dove N è di solito almeno 1 ma potrebbe essere più basato sul livello di abilità del lanciatore o su quanto vuoi che appaia: più giri = più piacevole.

In caso contrario, va bene imbrogliare fissando la rotazione in caso di colpo, e forse nasconderlo con uno schizzi di sangue. Come un mago, se lo fai abbastanza velocemente il giocatore non se ne accorgerà.

Certo, niente di tutto questo è realistico. Nella vita reale, il lancio del coltello è davvero difficile e richiede molta pratica se si desidera che il coltello atterri per primo. Il lanciatore deve essere pienamente consapevole della distanza e modificare di conseguenza il suo tiro, altrimenti il ​​coltello colpirà per primo.

1 : ci sono alcuni stili in cui il coltello va anche per primo.


4
+1: schizzi di sangue. Bene, trucchi magici. Modifica: o una nuvola di polvere per l'edizione non gore.
Theraot,

2
@Theraot e / o velocizza abbastanza la velocità di rotazione in modo che lo spettatore non riesca davvero a tenere traccia del modo in cui è puntato.
Perkins,

14
  1. Calcola la distanza in linea retta dal bersaglio.

  2. Ogni Frame imposta l'angolo del coltello su 2PI * (rimanenteStraightLineDistance) / (originalStraightLineDistance) * DesiredNumRotations.

Il rapporto di rotazione varierà leggermente se non si sposta il coltello in linea retta ma nessuno lo noterà mai.

Se non predeterminate il bersaglio (cioè state semplicemente lanciando e usando la fisica per vedere cosa colpisce) allora dovrete sfumare questo ma potete usare lo stesso principio di guardare quale bersaglio è probabile che colpisca e regolando la rotazione per essere corretta per quel bersaglio.


4

I veri coltelli da lancio sono progettati per avere un'alta probabilità di colpire prima la lama. Progetta i tuoi coltelli di conseguenza.

Collezione di coltelli da lancio da Wikipedia : Collezione di coltelli da lancio da Wikipedia

Vuoi il centro di massa, e quindi il centro di rotazione, il più lontano possibile dalla punta della lama . Ciò aumenterà le probabilità che la lama ruoti in posizione di colpire prima che la fine della maniglia arrivi.

La lama è in genere lunga e sottile, per sporgere il più lontano possibile dal centro di massa aggiungendo al contempo la minor quantità possibile. Inoltre, vi è un contrappeso spesso a forma di disco o sferico all'estremità del manico, cosa interessante che non vedo in nessuno dei coltelli dell'immagine di Wikipedia.

Il coltello viene lanciato tenendo la punta della lama e piegando la maniglia nella direzione di lancio.


2

Per un modo "fumo e specchi", puoi avere il centro di rotazione del coltello (cioè il centro di massa) vicino al manico (cioè parte non appuntita). In questo modo, se la velocità di rotazione è abbastanza elevata rispetto alla velocità del coltello, si può garantire che la punta della lama si scontrerà con il bersaglio e non con qualsiasi altra parte.

C'è qualche calcolo da ottenere quale è la velocità di rotazione minima dato il centro di massa e dimensioni, ma dovrebbe essere semplice. Nota anche che questo non implica nulla sull'angolo del colpo.


1

Lanciatore di coltelli perfetto?

Al momento, dici di girare il coltello attraverso l'animazione. Quale parametro stai usando per controllare l'angolo? Numero di telaio? Tempo di gioco? Ridimensionato da una frequenza di centrifuga arbitraria?

Se invece utilizzassi il parametro (distanza spostata) / (distanza totale dal bersaglio), con il ridimensionamento appropriato per pi e (numero di giri + 0,5), il coltello arriverebbe davvero sempre magicamente per primo.


La prima parte di questa domanda sembra chiedere chiarimenti. Probabilmente dovrebbe essere fatto come un commento sulla domanda. Potresti approfondire prima il metodo proposto per arrivare magicamente al punto? Ad esempio, dici "con il ridimensionamento appropriato per pi"; quale ridimensionamento? È giusto supporre che se l'utente deve chiedere, potrebbe non capire quale sarebbe il ridimensionamento appropriato.
Gnemlock,

@TimB ha fatto un lavoro migliore nel spiegarlo, ma la soluzione proposta da Neil è un buon approccio. Modifica la velocità dell'animazione del tuo coltello rotante in modo che quando raggiunge il bersaglio il coltello si trovi nella posizione "la punta appuntita va nell'altro uomo". Questo è molto più facile (da programmare E computazionalmente) rispetto al calcolo di traiettorie paraboliche che coinvolgono obiettivi in ​​movimento, ecc. Per quanto riguarda "il ridimensionamento appropriato per PI" che probabilmente sarebbe solo 2, dato che number_of_revolutions è un'altra variabile nella pseudoequazione di Neil. Se si tratta di animazioni di fotogrammi chiave, basta ridimensionare l'indice e dimenticare pi.
AC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.