Mantenere la rotazione tra due oggetti


9

Nel mio gioco XNA ho due oggetti che si scontrano. Quando il primo oggetto si scontra con l'altro, è in grado di agganciarsi e spostarlo nel mondo. Sto avendo un problema con la matematica qui (la matematica non è il mio punto di forza). Al momento ho il secondo oggetto agganciato al primo e mi muovo con esso, ma non riesco a farlo mantenere la direzione originale. Quindi, se l'oggetto è rivolto verso l'alto, dovrebbe mantenere questa direzione rispetto a come viene ruotato con l'oggetto originale.

inserisci qui la descrizione dell'immagine

Qualche consiglio su come potrei raggiungere questo obiettivo?


Penso che entrambi gli oggetti ruoterebbero attorno all'asse del centro dell'altro oggetto.
MichaelHouse

Risposte:


3

Per quanto riguarda l'angolo, basta mantenere l'angolo del secondo oggetto uguale all'angolo del primo. Per la posizione, quando i due oggetti si scontrano tra loro, trova la distanza del secondo oggetto dal primo usando la formula della distanza.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Per trovare la posizione del secondo oggetto rispetto al primo oggetto:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

Oltre alla risposta di @ tesselode, ti consiglio di tenere un elenco di oggetti collegati per ogni oggetto del mondo nel tuo gioco. Qualcosa del genere List<WorldObject> AttachedObjects. Quindi, quando rilevi una collisione, aggiungi il rettangolo nero a quello rosso AttachedObjects. Dopodiché, si tratta solo di aggiornare le posizioni dei bambini usando il metodo @ tesselode ogni volta che si aggiorna la posizione del genitore.


2

Suppongo che uno dei due avrà il controllo sull'altro, proprio come un carrello elevatore. Nel tuo disegno, suppongo che questo sia quello nero e quello rosso sia il pacchetto. Hai solo detto che hai problemi con gli angoli, quindi è tutto ciò che tratterò.

Quando gli oggetti si agganciano, dovresti ricordare la differenza di angolo tra i due (chiamerò questo Theta). Ho disegnato questo nella figura 2 con le frecce della prima figura disegnate una sopra l'altra. Fino a quando gli oggetti non vengono sbloccati, l'angolo dell'oggetto Rosso sarà determinato dall'angolo del Nero più Theta, come mostrato nella Figura 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Angle Diff


1

È possibile implementare la possibilità di avere oggetti figlio per un oggetto (in cui gli oggetti figlio sarebbero automaticamente interessati dalle modifiche alla posizione / rotazione del genitore). Quindi, in caso di collisione, quando si devono agganciare, si crea un oggetto invisibile e si fanno figli di entrambi gli oggetti attaccati. Quindi, invece di applicare trasformazioni (movimento, rotazione) sui singoli oggetti, lo applichi su quello grande, OPPURE potresti ancora applicare forze ai singoli oggetti figlio, che controllerebbe "Ho un genitore?", E se sì, la forza verrebbe inviata al genitore (che unirebbe le forze di tutti gli oggetti figlio in un vettore che si applicherebbe a se stesso).

Inoltre, questo approccio dovrebbe gestire correttamente la loro rotazione, se si calcola il centro di massa per il genitore invisibile in base ai pesi degli oggetti bloccati, che il metodo di John non sembra realizzare (l'oggetto unito ruota attorno al loro nuovo centro di massa condiviso, non intorno al centro di massa di uno degli oggetti) e potresti facilmente nidificare questo tipo di comportamento senza che sia necessario alcun codice aggiuntivo. Sembra essere l'approccio più solido e flessibile.

+ condizione se la forza applicata al bambino è abbastanza forte da rompere l'articolazione e puoi gestirne il "sblocco" semplicemente rimuovendo la relazione genitore-> bambino. Se è rimasto solo un figlio, lo rendi anche separato e rimuovi anche il genitore invisibile.

Posso fornire maggiori dettagli (con immagini e almeno pseudocodici e simili) se sei interessato.

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.