Come faccio a convertire dallo spazio di coordinate globale in uno spazio locale?


13

Data un'entità denominata EntityA, voglio definire uno spazio di coordinate locale, in cui la posizione di EntityAè l'origine, il suo vettore di rotta è l'asse X e la normale del vettore di rotta è l'asse Y:

descrizione pittorica dello stesso

Date le loro coordinate globali, come posso trovare la posizione di un'altra entità nello EntityAspazio locale?

Un esempio: EntityAla posizione globale è (50,50) e quella di EntityBè (80,90). Qual è quindi la posizione di EntityBnello EntityAspazio locale?

EDIT: Per favore, andate piano con la matematica.

Risposte:


21

Ok, supponendo che tu sappia quale sia la matrice di Trasformazione del Mondo per quell'oggetto A, devi solo costruire l'inverso di quella matrice e avrai ciò di cui hai bisogno.

Supponiamo della rotazione, scalatura e traduzione matrici di oggetto A usato per farlo spazio globale sono R , S e T rispettivamente. Li moltiplicherai insieme come

S * R * T = W

Ora, prendi W e trova in qualche modo la sua inversa W ^ -1 . L'inverso di una matrice è quella matrice che fa esattamente il contrario. Il prodotto della matrice con il suo inverso è sempre la matrice dell'identità.

W * W ^ -1 = I

quindi W ^ -1 = I / W ;

Ora applica questa matrice inversa come trasformazione del mondo alla scena e ogni oggetto sarà nelle coordinate desiderate.

Per la moltiplicazione della matrice, vedere questa pagina. Per la matrice Identity, vedi questo.

Ecco un'altra pagina che vi dà le matrici si avrebbe bisogno di fare W .

Nella domanda sopra, dovresti prendere la traduzione in asse x come 50, la traduzione in asse y come 50, nessun ridimensionamento in nessuno degli assi e una rotazione che non hai specificato.


Grazie per la risposta, ma in realtà non capisco molto di questo. Non molto bravo in matematica. Con è una matrice? Cosa intendi con "matrici di rotazione, ridimensionamento e traduzione"?
Aviv Cohn,

Una matrice è un modo molto compatto di rappresentare un insieme di numeri o oggetti correlati. Nella computer grafica, sono ampiamente utilizzati per effettuare calcoli. controlla l'ultimo link nella risposta per sapere cosa intendo per traduzione di rotazione e Matrici di scaling.yes, dovrai leggere tutto questo. Altrimenti puoi usare il metodo di ashes999 per risolvere il tuo problema, ma questo non tiene conto della rotazione e del ridimensionamento di EntityA, se presente.
The Light Spark

9

L'ho fatto con la trigonometria piuttosto che con le matrici in passato (sono un matrix noob). La risposta di Ashes999 è a metà strada, ottieni il vettore relativo, quindi ruota quello dall'inverso dell'angolo di EntityA.

   relativeX = B.x - A.x
   relativeY = B.y - A.y
   rotatedX = Cos(-Angle) * relativeX - Sin(-Angle) * relativeY
   rotatedY = Cos(-Angle) * relativeY + Sin(-Angle) * relativeX

2
+1 Trigonometria molto più intuitiva e più facile da usare rispetto alle matrici.
Ramchandra Apte,

E la scala? Quando lo applichi?
Llamageddon,

Scusa, intendevo rotazione.
Llamageddon,

6

Lasciami provare a darti qualcosa tra la risposta di The Light Spark e la risposta di Elliot, perché da quello che ho letto, stai davvero cercando un algoritmo da seguire e non solo la matematica lanciata su di te.

Dichiarazione del problema: dato che hai una posizione A (50, 50)e un'intestazione (dal momento che non ne hai fornito uno, lo affermerò come y = 2 * x + 25), trova dove B (80, 90)è relativo Ae l'intestazione.

Quello che vuoi fare è in realtà abbastanza semplice. 1) Trasferisciti Aall'origine del tuo sistema. Questo significa semplicemente che i Avalori da locale a valori saranno i valori della posizione globale meno i valori della posizione globale di A. Adiventa (0, 0)e Bdiventa (30, 40).

1.1) Anche l'intestazione deve essere spostata. Questo è in realtà molto facile da fare, perché l'intercetta y in Atermini locali è sempre 0 e la pendenza non cambierà, quindi abbiamo y = 2 * xcome rotta.

2) Ora dobbiamo allineare la prua precedente all'asse X. Quindi, come possiamo farlo? Il modo più semplice, concettualmente per farlo, è convertire da coordinate x, y in un sistema di coordinate polari. Il sistema di coordinate polari comporta Rla distanza da una posizione e phiun angolo di rotazione dall'asse x. Rè definito come sqrt(x^2 + y^2)ed phiè definito come atan(y / x). La maggior parte dei linguaggi informatici oggigiorno va avanti e definisce una atan2(y, x)funzione che fa esattamente la stessa cosa atan(y/x)ma lo fa in modo tale che l'output tenda da -180 gradi a 180 gradi anziché da 0 gradi a 360 gradi, ma entrambi funzionano.

Bcosì diventa R = sqrt(30^2 + 40^2) = sqrt(2500) = 50, e phi = atan2(40, 30) = 53.13in gradi.

Allo stesso modo, l'intestazione ora cambia. Questo è un po 'complicato da spiegare, ma perché l'intestazione, per definizione, passa sempre attraverso la nostra origine A, non dobbiamo preoccuparci del Rcomponente. I titoli saranno sempre nella forma di phi = Cdove Cè una costante. In questo caso, phi = atan(2 * x / x) = atan(2) = 63.435gradi.

Ora, possiamo ruotare il sistema per spostare la direzione sull'asse X del sistema locale A. Proprio come quando ci siamo trasferiti Aall'origine del sistema, tutto ciò che dobbiamo fare è sottrarre phil'intestazione da tutti i phivalori nel sistema. Quindi il phiof Bdiventa 53.13 - 63.435 = -10.305gradi.

Infine, dobbiamo riconvertire le coordinate polari in coordinate x, y. Le formule per fare quella trasformazione sono X = R * cos(phi)e Y = R * sin(phi). Per Bconseguenza, si ottiene X = 50 * cos(-10.305) = 49.2e Y = 50 * sin(-10.305) = 8.9, così Bin locali-to Acoordinate è vicino a (49,9).

Spero che questo aiuti, ed è abbastanza leggero in matematica da seguire.


1

Devi conoscere la posa dell'Entità A nello spazio globale (x1, y1, θ), dove θ è l'orientamento relativo all'asse x.

Per convertire la posizione EntityB da una coordinata globale (x2, y2) in una coordinata locale (x2 ', y2'):


  1. Usando le espressioni

Da globale a locale

x2' = (x2-x1)cosθ + (y2-y1)sinθ

y2' = -(x2-x1)sinθ + (y2-y1)cosθ

Da locale a globale

x2 = x2'cosθ - y2'sinθ + x1

y2 = x2'sinθ + y2'cosθ + y1

  1. Usando le matrici:

    R = [cosθ   -sinθ
    
         sinθ    cosθ]
    
    A = [x1
         y1]
    
    B_global = [x2
                y2]
    
    B_local = [x2' 
               y2']

Da globale a locale

    B_local = inv(R) x (B_global - A)

Da locale a globale

    B_global = R x B_local + A

-2

Per dirla semplicemente, l'entità B avrebbe bisogno di un riferimento all'entità A. Dovresti quindi ottenere la differenza tra la posizione A dell'entità e la posizione dell'entità B.


3
Non capisco come questo risponda alla domanda.
Anko,
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.