c# 3d xna 2d

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);