¿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.
así que tomo la primera foto de un cubo de Rubik y seleccione 4 puntos en el cubo como en el ejemplo aquí 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í
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í
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);
¿Los puntos tienen que seguir las reglas? como todos deben ser coplaner? – MerickOWA
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