2012-04-04 23 views
16

¿Puede alguien darme algunos consejos o sugerenciasMovimiento de 2D a 3D

Necesito encontrar la cantidad de un objeto en una fotografía ha pasar de una posición a otra (bueno en realidad lo que necesito para calcular la cantidad de la cámara tiene movido entre 2 imágenes, pero como el objeto permanecerá estacionario y solo girará en su eje Y, creo que será más fácil mover la imagen). Más o menos lo mismo que este ejemplo pero no tan complicado. enter image description here

así que tomo la primera foto de un cubo de Rubik y seleccione 4 puntos en el cubo como en el ejemplo aquí enter image description here La imagen es una Texture2D y los círculos azules representan los 4 puntos de la cara frontal de la cubo seleccionado por el usuario. Estos 4 puntos se almacenan en la lista y se carga la siguiente imagen que se ve así enter image description here De nuevo, el usuario tiene que seleccionar los 4 puntos de la misma cara que el anterior (la cara blanca). Entonces estos 4 puntos se almacenan en una nueva lista.

así que ahora tengo dos listas y necesito calcular la cantidad de la "cara frontal conjunto" se ha movido (rotación/escala/traslación) de la imagen 1 a la imagen 2, como se muestra aquí enter image description here

Pero lo más importante , Necesito calcular este movimiento en 3D! Entonces, para la primera imagen supongo que el componente z = 0. Por ejemplo, supongo que la esquina superior izquierda de la imagen 1 = p. (10, 10, 0)

¿Hay alguna manera en que pueda "asumir" que si la cara de la imagen 2 ha girado/escalado/traducido de alguna manera que se puede mover en el espacio 3D? Entonces, si la esquina superior izquierda de la imagen 2 está a la derecha de la esquina superior izquierda de la imagen 1 (imagen de inicio), la cámara debe haberse movido hacia la derecha. ¿Y lo mismo iría por arriba o por abajo de los puntos? En cuanto a la rotación, ¿podría quizás calcular los ángulos entre los puntos de la imagen 1 y los ángulos entre los puntos de la imagen 2 y de alguna manera calcular cuánto ha girado la cámara?

Para mi código ¿Estaba pensando algo como esto?

// 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, ?)); 

Para el movimiento hacia la izquierda o la derecha justo calcular la cantidad de cada punto se ha movido

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

Y para inclinación (Im un poco atascado) ....

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

¿Los puntos tienen que seguir las reglas? como todos deben ser coplaner? – MerickOWA

+0

Sí, a los fines de la aplicación, todos los puntos se considerarán coplanares. De modo que el usuario solo puede seleccionar una cara del cubo y todos esos puntos se considerarán en un solo plano – heyred

Respuesta

2

matriz mundo * ver la matriz (de la cámara) * proyección (de la cámara) = transformar la matriz

Suponiendo que cube1 = posición inicial.
Lo que sucede rendir durante es: matriz cube1 * transformMatrix = salida

Si entiendo a corregir: su entrada permite al usuario cambiar la matriz de la cámara (ver) solamente,
(y la cámara = Vista * proyección) Y desea averiguar la nueva transformación del cubo después de actualizar la cámara.

Así que hay que hacer la operación invertido:

outputmatrix/transformMatrix = matriz cube1 (el nuevo necesitará)

de la nueva matriz de resultados cube1 puede extraer el ángulo, el movimiento y etc.

Por lo tanto, su problema está más relacionado con "qué" implementar, no cómo implementarlo.
(como te veo familir con los comandos y el código que necesitas)

Espero que esto ayude.

Cuestiones relacionadas