Come determinare quali propulsori attivare per ruotare la nave?


47

La configurazione della nave cambia in modo dinamico, quindi devo determinare quale propulsore attivare quando voglio ruotare la nave in senso orario o antiorario. I propulsori sono sempre allineati agli assi con la nave (mai inclinati) e sono accesi o spenti. Ecco una delle possibili configurazioni:

http://i.stack.imgur.com/GSBSH.png

Quello che ho provato finora è di visualizzare il vettore di fuoco e il vettore di direzione al centro della massa della nave:

http://i.stack.imgur.com/ZzNzi.png

Sfortunatamente, non sono andato molto lontano.


7
Ti stai dirigendo nella giusta direzione con i vettori di forza. Prova a cercare le formule per la velocità ANGOLARE poiché stai cercando di ruotare la nave attorno al centro di massa.
Amplifica91 il

Dimentico esattamente come farlo, ma fondamentalmente sono solo le forze su ogni punto en.wikipedia.org/wiki/Center_of_mass e soprattutto en.wikipedia.org/wiki/Parallel_axis_theorem
CobaltHex

1
Ho avuto esattamente la stessa idea! Un suggerimento che potrebbe renderti più semplice è che devi solo calcolare l'accelerazione angolare e lineare una volta per ogni propulsore, quindi i calcoli possono essere complessi come desideri.
Markus von Broady,

@ Amplify91, il tuo commento relly mi ha aiutato a capirlo, grazie!
migimunz,

1
@migimunz Stavo piuttosto pensando di calcolare le accelerazioni per propulsore, non per tasto premuto (gruppo di propulsori). Inoltre, dare al giocatore la scelta di quali propulsori attivare e quale tasto premuto potrebbe essere interessante (alcune persone scamberebbero una rotazione più veloce per ruotare in posizione)
Markus von Broady,

Risposte:


22

Successo! Eccolo, e sta ruotando come dovrebbe: inserisci qui la descrizione dell'immagine

Quello che ho fatto è il seguente: per ogni propulsore, calcolo l'entità della coppia, in relazione al centro di massa.

private function thrustTorque():Float
{
    // distToCom is the distance vector between the thruster and center of mass
    // fire angle is a unit vector representing the direction of the thruster
    var distAngle = Math.atan2(distToCOM.y, distToCOM.x);
    var fireAngle = Math.atan2(dir.y, dir.x);
    var theta = fireAngle - distAngle;
    var torque = distToCOM.length * Math.sin(theta);
    return torque;
}

L'equazione per la mangialità della coppia, secondo Wikipedia, è T = rF sin(theta)dove:

  • r è la distanza tra il propulsore e COM
  • F è la grandezza della forza applicata (la lascio fuori, fingendo che sia solo una, perché mi interessa solo il segno).
  • theta è l'angolo tra i due vettori

Quando il giocatore preme a sinistra, controllo il segno di coppia per quel propulsore - se è inferiore a zero, sparo il propulsore. È esattamente il contrario per girare in senso orario.

Questo potrebbe probabilmente essere migliorato usando il prodotto punto per calcolare il coseno dell'angolo tra i vettori, ma dovrà aspettare fino a domani.

Infine, ecco una demo dal vivo .


Quasi lì penso. Sembra non essere esattamente al centro della massa. Usando solo le frecce sinistra / destra, la nave può facilmente uscire dallo schermo. Molto vicino però. Forse il punto da cui stai misurando è leggermente fuori. Oppure potrebbe essere un problema di temporizzazione poiché sembra stabilizzarsi in una buona rotazione dopo un po '. Bel lavoro però.
MichaelHouse

Non penso che abbia a che fare con questa logica. Non c'è nulla qui per garantire che il veicolo non riceva una forza traslazionale netta dal fuoco dell'insieme di thurster selezionato da questo meccanismo. Se non è necessario mantenere una forza di traduzione netta, sarà necessario poter modulare la forza dei singoli propulsori (e probabilmente diventerà un problema molto più difficile da risolvere)
Trevor Powell,

@TrevorPowell, esattamente. Per semplicità (e anche divertimento, dato che le prestazioni della tua nave dipenderanno da quanto bene la progetterai), ho deciso che i propulsori sono accesi o spenti. Probabilmente includerò una soglia in modo che quelli che causano una coppia insufficiente (e quindi un eccessivo movimento laterale) non siano attivati, ma esattamente quanto sarà "troppo / poco" sarà probabilmente determinato da tentativi ed errori.
migimunz,

3
Quello che si desidera fare per evitare i calcoli angolari è utilizzare il prodotto punto perpendicolare (derivato dalla definizione del prodotto incrociato di coppia T = r croce F se si utilizzano vettori 3D con z = 0). Prendi il vettore (-ry, rx), che è perpendicolare a r con la stessa magnitudine, e calcoli il prodotto punto di quel vettore con F. Il risultato è T = rx * Fy - ry * Fx. Quindi abs (T) è l'entità della coppia e il suo segno indica la direzione: T> 0 è in senso antiorario, T <0 è in senso orario.
Joren,

1
Il motivo per cui funziona è facile da vedere intuitivamente: r punto F = r F cos θ. Se si ruota r di 90 gradi in senso antiorario e si prende il prodotto punto, si ottiene r F sin θ perché cos (θ - 90˚) = sin (θ).
Joren,

14

L'espressione generale 3D per coppia è il prodotto vettoriale di spostamento e forza: T = rF . In due dimensioni, sarà sufficiente un valore scalare per la coppia e, dati solo quattro orientamenti ortogonali per i propulsori, possiamo scrivere in forma a tratti:

  • Forza in direzione + x: T = F * (-ry)
  • Forza in direzione -x: T = F * (ry)
  • Forza in direzione + y: T = F * (rx)
  • Forza in direzione -y: T = F * (-rx)

Qui, F è l'entità della forza generata dai propulsori, rx e ry sono componenti xey del vettore dal punto di articolazione al propulsore. Le coppie positive tendono a ruotare la nave in senso antiorario. Utilizzando le quattro formule precedenti, è banale dedurre il segno della coppia prodotta da ciascun propulsore.

Per una rappresentazione della fisica modestamente accurata, è necessario non solo conoscere il segno della spinta, ma anche la sua grandezza totale e l'inerzia rotazionale. Inoltre, potresti semplicemente non voler attivare tutti i propulsori correttamente allineati per eseguire una rotazione.

Navicella spaziale

Come disegnato, la piena potenza ai propulsori B, D ed E massimizzerà la rotazione, ma accelererà anche la nave a destra. La chiusura di D impedirà questo. Se invece si intende accelerare a destra, ma non una rotazione in senso orario, il modo più efficiente di procedere è abilitare sia C che F a due terzi della piena potenza insieme a D.

Se questo non va oltre lo scopo di ciò che stai cercando di fare, dovresti scrivere una sorta di risolutore per le equazioni del movimento, chiaramente non un semplice compito.


7

Alcune cose diverse. Innanzitutto, dobbiamo riconoscere che si tratta di un problema sotto vincolato. Cioè, ci sono molte diverse combinazioni di propulsori che possono sparare per provocare la rotazione nella stessa direzione. Presumo che nella tua situazione ci siano solo due stati per i propulsori, "on" e "off", e tutti i thruster emettono la stessa forza.

In secondo luogo, osservando il tuo modello, sembra che il tuo "centro di massa" non sia in realtà il tuo centro di massa. Fortunatamente, questo non influirà sui tuoi calcoli per la coppia. Tuttavia, effettuerà i tuoi calcoli per il centro di spostamento di massa. Non sono sicuro che ti interessi della precisione a quel livello, poiché il tuo "centro di massa" è almeno il quadrato più vicino al vero centro di massa.

In terzo luogo, se si desidera calcolare in che modo un determinato propulsore influirà sulla rotazione, è corretto, sebbene si stia utilizzando una formula inefficiente. La coppia può essere calcolata come r x F, che ha magnitudine r*F*sin(theta). Tuttavia, il calcolo degli angoli in questo caso è un metodo inefficiente. Invece, dovresti usare direttamente la definizione di coppia tra i prodotti, poiché sarà molto più semplice usando le rappresentazioni che hai. Poiché tutti i tuoi vettori non hanno componenti z, la formula per prodotti incrociati semplifica notevolmente.

Senza modificare i risultati del tuo calcolo, possiamo semplicemente aggiornare il tuo codice

private function thrustTorque():Float
{
    var torque = distToCOM.x*dir.y-distToCOM.y*dir.x;
    return torque;
}

È molto più bello (e più veloce).

Suggerisci nella tua risposta che la tua soluzione è quella di sparare tutti i propulsori con la coppia nella giusta direzione. Ora, questo risolve praticamente la domanda che hai posto. Tuttavia, mi aspetto che un certo punto lungo la linea, scoprirai che la tua strategia non è così soddisfacente, se un utente tiene premuto il pulsante "ruota" e tutti i propulsori con una coppia positiva ruotano, potenzialmente spostandoli in alto di ruotarli (non sono sicuro del livello di dettaglio della tua simulazione, se in realtà calcoli le forze dai propulsori o se mostri solo visivamente che sparano e quindi ruota il tuo modello con un'accelerazione costante o qualcosa del genere. modo, vuoi che i propulsori sparino almeno approssimativamente con precisione).

Non prendere in considerazione la forza netta sulla nave. Se avessi quantità di propulsori arbitrarie, questo potrebbe trasformarsi in un problema piuttosto complicato. Tuttavia, poiché i nostri propulsori hanno solo due stati, è piuttosto semplice da analizzare. Non sono sicuro di quale sia il nostro obiettivo qui, quindi potrei immaginarne due diversi: in primo luogo, vogliamo ridurre al minimo la forza totale, mantenendo comunque la coppia nella direzione che vogliamo. In secondo luogo, vogliamo massimizzare il rapporto tra coppia e forza totale.

A parte questo, se potessi immaginare un ulteriore controllo del "volume del propulsore" che influenza contemporaneamente la potenza di tutti i propulsori, allora potresti impostare questo controllo in modo che le tue due soluzioni abbiano la stessa coppia, e vedi che la seconda soluzione può avere solo un spostamento minore rispetto al primo. Tuttavia, dobbiamo ricordare che se è possibile sparare i propulsori in modo da ruotare solo e non muoverti affatto, entrambe le soluzioni saranno le stesse.

Quindi, andremo con la seconda soluzione, basata sugli argomenti del paragrafo precedente. Ora, analizzando la forza totale, possiamo semplicemente notare che ci sono solo quattro direzioni che i motori possono indicare. Quindi la forza totale nella direzione x è solo il numero di propulsori che puntano a sinistra meno il numero che punta a destra, e allo stesso modo per la direzione y.

Dopo aver scritto fino a questo punto, devo pensare ancora un po 'all'algoritmo per ottimizzarlo. Penso che il resto del mio post sia utile così com'è, quindi lo sto postando, ma lo aggiornerò quando scoprirò il modo migliore per ottimizzare questa configurazione (ho pensato ad alcuni modi per ottenere risposte approssimative, ma nessuno di questi è esatto).


Grazie per la risposta (e la soluzione più rapida e pulita per il calcolo della coppia). Il cerchio rosso non è COM della nave, ma è il nucleo di potere. Sto usando un motore fisico e sto semplicemente applicando un impulso locale alla nave. Sto bene con la soluzione non essere perfetta in quanto rende molto divertente giocare con diverse configurazioni, ma mi piacerebbe sapere cosa ti viene in mente.
migimunz,

1
È possibile calcolare la coppia da un punto di riferimento arbitrario. Il numero risultante cambierà, ma finché ruoterai la nave attorno a questo punto, che non deve necessariamente essere il centro di massa, il comportamento fisico non cambierà. In effetti, senza informazioni sulla distribuzione di massa, il centro di massa è arbitrario stesso e non può essere calcolato come tale.
Marcks Thomas,
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.