2012-04-04 8 views
16

Qualcuno può darmi qualche consiglio o suggerimentoMovimento dal 2D al 3D

Ho bisogno di trovare quanto un oggetto in una fotografia è spostarsi da una posizione all'altra (beh in realtà ho bisogno di calcolare quanto la fotocamera dispone di spostato tra 2 immagini, ma poiché l'oggetto rimarrà stazionario e sarà solo ruotato sul suo asse Y, penso che sarà più facile spostare l'immagine). Praticamente uguale a questo esempio, ma non altrettanto complicato. enter image description here

così prendo la prima foto di un cubo di Rubik e selezionare 4 punti sul cubo come nell'esempio qui enter image description here L'immagine è un Texture2D ed i cerchi blu rappresentano i 4 punti della faccia anteriore del cubo come selezionato dall'utente. Questi 4 punti sono memorizzati nella lista e l'immagine successiva viene caricata come questa enter image description here Ancora una volta l'utente deve selezionare i 4 punti della stessa faccia del precedente (la faccia bianca). Quindi questi 4 punti sono memorizzati in una nuova lista.

Così ora ho due liste e ho bisogno di calcolare quanto il "volto frontale intera" si è spostato (rotazione/scala/tradurre) un'immagine da 1 a immagine 2 come mostrato qui enter image description here

Ma ancora più importante , Ho bisogno di calcolare questo movimento in 3D! Quindi per la prima immagine presumo che z-component = 0. Ad esempio, presumo l'angolo in alto a sinistra dell'immagine 1 = ad es. (10, 10, 0).

C'è un modo che posso "supporre" che se la faccia dell'immagine 2 è stata ruotata/ridimensionata/tradotta in un certo modo che può essere spostata nello spazio 3D? Pertanto, se l'angolo in alto a sinistra dell'immagine 2 è a destra dell'immagine 1 (immagine iniziale) nell'angolo in alto a sinistra, la fotocamera deve essersi spostata a destra. E lo stesso andrebbe per su o giù dei punti? Per quanto riguarda la rotazione, potrei forse calcolare gli angoli tra i punti dell'immagine 1 e gli angoli tra i punti dell'immagine 2 e in qualche modo calcolare quanto la fotocamera ha ruotato?

Per il mio codice stavo pensando qualcosa del genere?

// Image 1 coordinates for the front face 
// Assume z = 0 
cube1 = new List<Vector3>(); 
cube.Add(new Vector3(10, 10, 0)); 
cube.Add(new Vector3(20, 10, 0)); 
cube.Add(new Vector3(10, 20, 0)); 
cube.Add(new Vector3(20, 20, 0)); 

// Get image 2 coordinates 
cube2 = new List<Vector3>(); 
cube.Add(new Vector3(newX, newY, ?)); // Keep Z = 0? 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 

Per il movimento a sinistra oa destra Basta calcolare quanto ogni punto si è spostato

//Translation 
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY, 0)); 
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating); 

E per skew (Im un po 'bloccato) ....

// Rotation 
Matrix rotation = Matrix.CreateFromAxisAngle( 
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here 
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation); 
+1

I punti devono seguire le regole? come devono essere tutti coplaner? – MerickOWA

+0

Sì, ai fini dell'applicazione, tutti i punti saranno considerati complanari. Quindi l'utente può selezionare solo una faccia del cubo e tutti i punti saranno considerati su un piano – heyred

risposta

2

matrice mondo * matrice di visualizzazione (della telecamera) * proiezione (della telecamera) = matrice di trasformazione

Assumendo che cube1 = posizione iniziale.
ciò che accade durante il rendering è: matrice Cube1 * transformMatrix = uscita

Se comprendo si corregge: l'input consente all'utente di cambiare matrice fotocamera (vista) soltanto,
(e telecamera = vista * proiezione) E vuoi scoprire la nuova trasformazione del cubo dopo l'aggiornamento della telecamera.

quindi è necessario fare il funzionamento invertito:

outputmatrix/transformMatrix = matrice Cube1 (quello nuovo è necessario)

dalla nuova matrice risultato Cube1 è possibile estrarre gli angoli, movimento e ecc.

Quindi, il tuo problema è più relativo a "cosa" da implementare, non a come implementarlo.
(come ti vedo familir con i comandi e il codice che ti servono)

Spero che questo aiuti.