In unità, ho una racchetta che dovrebbe colpire una palla e la racchetta è controllata direttamente dal mouse, cioè il pipistrello viene spostato da il mouse usando gli assi del mouse e la funzione transform.translate() per spostare la racchetta.Problema con il rilevamento di collisione di una palla che si muove rapidamente con una racchetta controllata con il mouse
Mi aspettavo che la fisica di Unity3d non traduca correttamente i movimenti della racchetta direttamente con il mouse e abbia un impatto sulla palla di conseguenza, e dovrei scrivere qualcosa di personalizzato, e si è rivelato essere vero.
Ma la collisione della palla non viene rilevata correttamente quando la racchetta si sta muovendo. Quando è fermo, tutto va bene e la palla si comporta come mi piace.
Ora sono arrivato a scrivere uno script di fisica personalizzato (io uso C# per gli script) in cui ho collegato 4 raycast di lunghezza 0.6F alla pallina, e dopo aver fatto alcuni calcoli vettoriali complessi, calcolare la velocità della palla dopo aver colpito la racchetta, e applicarlo direttamente alla velocità della palla usando rigidbody.velocity = calculateVelocity(). Ora funziona di nuovo bene quando la racchetta non si muove, ma non quando muovo la racchetta. Il problema esatto (sintomi del) è:
Uso della rilevazione fisica e della collisione incorporata: quando la racchetta si muove, la palla passa a volte attraverso la racchetta e, a volte, rallenta (a livelli incredibili).
Utilizzo del mio script per calcolare la velocità: il problema è lo stesso, ma mi consente di identificare ciò che è sbagliato quando stampo il normale del collisore (la racchetta). A volte dà il diritto normale, e qualche volta dà il negativo del vettore normale, il che significa che sta andando dritto attraverso la superficie superiore e rilevando il colpo con il lato inferiore del collisore (racchetta).
Le cose che ho provato:
L'aumento delle dimensioni del collider (funziona con la casella collider più ampio sulla racchetta, ma poi, ovviamente, la palla si muove da una certa distanza dal racket, e il mio script funziona qui, la fisica di default dà strani risultati quando si muove la racchetta), in breve non capisco la realtà che voglio.
Diminuendo il timestamp fisso a 0,001, che ha migliorato in modo significativo le cose, ma ancora molto molto lontano dal risultato che voglio, e la palla è ancora abbastanza spesso raccogliendo il lato sbagliato della palla.
Modifica del rilevamento di collisione su dinamica continua. Neanche questo ha migliorato le cose.
Ed oltre al lato sbagliato scelto a collisione, un altro problema che ho osservato è che dopo rimbalzando la racchetta, la palla è muove ma la racchetta viene spostato più veloce, invece di muoversi in un arco completo o linea, in qualche modo appare davanti alla palla, risultando in due colpi. È una congettura basata su ciò che è visibile.
Inoltre è chiaro che l'aspetto "movimento" della racchetta non viene letto dalla fisica incorporata di Unity3d, risultando in uno strano comportamento quando la racchetta si muove usando il mouse per colpire la palla.
Sono bloccato, non ho idea di dove spostare da qui. Per favore dimmi cosa sto facendo di sbagliato.
Ho provato a impostare la massima velocità sia per la racchetta che per la palla, posso forse aumentare le dimensioni dell'intero ambiente, forse questo potrebbe dare maggiori possibilità di rilevare il lato destro del collisore. Implementerò sia la soluzione fornita da Justin808 che aumenterò le dimensioni di tutto. – SpeedBirdNine
Questa cosa ha funzionato così bene, ho raddoppiato le dimensioni di tutto, e ora non manca una collisione. Ho ancora l'altro problema di cui parlava Justin808, che la racchetta in un momento è davanti alla palla e il fotogramma successivo è dietro la palla, ma almeno vedo due collisioni distinte, che possono essere gestite con il codice! Molte grazie! Mi ci sono voluti solo 2 minuti per farlo. Ora ho intenzione di implementare la soluzione di Justin per risolvere due collisioni. A questo punto se qualcuno ha altre spiegazioni, per favore condividi anche tu! – SpeedBirdNine
Risolto il problema, non ho dovuto posizionare un raggio tra la posizione precedente e quella successiva della palla, poiché ora il collisore della racchetta non manca la palla. L'altra cosa è che il movimento della racchetta attraverso il mouse non si traduce in un'ulteriore forza applicata alla palla. Ho dovuto scrivere questa parte da solo, e impostare istrigger come vero per il collisore della racchetta in modo che la fisica originale non interferisca. Ma ora c'era il problema di colpire più volte, l'ho risolto usando un flag, che diventa falso quando viene colpito per la prima volta, e true di nuovo dopo 1 secondo, o quando la palla colpisce un altro oggetto. Funziona! – SpeedBirdNine