c# - Movimiento de 2D a 3D
xna (1)
matriz mundial * vista matriz (de cámara) * proyección (de cámara) = matriz de transformación
Suponiendo que cube1 = posición inicial.
Lo que ocurre durante el procesamiento es: cube1 * transformMatrix = matriz de salida
Si entiendo que es correcto: su entrada permite al usuario cambiar la matriz de la cámara (vista) solamente,
(y camera = view * projection) Y desea descubrir la nueva transformación del cubo después de actualizar la cámara.
Entonces necesitas hacer una operación de inversión:
outputmatrix / transformMatrix = matriz del cubo1 (la nueva que necesitarás)
a partir de la nueva matriz de resultados cube1 puede extraer los ángulos, el movimiento y etc.
Entonces, 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.
¿Alguien puede darme algunos consejos o sugerencias
Necesito encontrar cuánto se mueve un objeto en una fotografía de una posición a otra (bueno, de hecho, necesito calcular cuánto ha movido la cámara 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 tomé la primera foto de un cubo de rubik y seleccioné 4 puntos en el cubo, como en el ejemplo aquí La imagen es un Texture2D y los círculos azules representan los 4 puntos de la cara frontal del cubo seleccionados 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 debe 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 cuánto se movió la "cara frontal completa" (rotar / escalar / traducir) de la imagen 1 a la imagen 2, como se muestra aquí
Pero más importante aún, ¡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 = ej. (10, 10, 0).
¿Hay alguna manera de que pueda "asumir" que si la cara de la imagen 2 se ha rotado / escalado / traducido de alguna manera, esto 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 rotar, ¿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 hacia la derecha simplemente calcule cuánto se movió cada punto
//Translation
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY, 0));
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating);
Y para skew (estoy un poco atascado) ....
// Rotation
Matrix rotation = Matrix.CreateFromAxisAngle(
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation);