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.
così prendo la prima foto di un cubo di Rubik e selezionare 4 punti sul cubo come nell'esempio qui 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
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
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);
I punti devono seguire le regole? come devono essere tutti coplaner? – MerickOWA
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