¿Cómo convierto un movimiento 2D (desde el mouse) en un desplazamiento a lo largo de un eje 3d?


8

Estoy haciendo un pequeño editor de escenas 3D (que solo permite modificar las posiciones de los objetos).

Cada objeto se dibuja con un eje X / Y / Z 3d:

ingrese la descripción de la imagen aquí

Cómo funciona: el usuario elige un eje (X, Y o Z) haciendo clic izquierdo sobre él, luego, mientras mantiene presionado el botón izquierdo, mueve el mouse (para mover el objeto en la dirección del eje). la selección ya está bien, pero me gustaría saber que how muchel objeto debe traducirse para el eje seleccionado, dependiendo del movimiento del mouse 2D.

Por ejemplo, en esta imagen, seleccionar el eje X y mover el mouse de izquierda a derecha debería dar un desplazamiento mayor que moverlo hacia arriba (casi cero para este)

Debe ser realmente simple pero no puedo entenderlo.

La entrada debe ser: desplazamiento del mouse desde el primer clic izquierdo (vector 2D), vector de eje seleccionado (vector 3d), vista de modelo / matriz de proyección.

Salida: cantidad (flotante o doble)


Puede comparar la dirección en la que el usuario mueve el mouse con respecto al objeto comparando la orientación del objeto con la orientación de la cámara.
MichaelHouse

Respuestas:


5

¿Cómo quieres que se comporte esto? Hay maneras diferentes de hacer esto.

Una opción simple es simplemente mover el objeto por un número fijo de unidades de espacio mundial para cada unidad de espacio de pantalla (píxel, por ejemplo) que mueve el mouse.

Otra opción es tomar el vector de movimiento del mouse y proyectarlo en el eje de movimiento a través de las matrices normales de proyección / cámara. Proyecte el vector de movimiento del mouse a través de la vista inversa, la proyección y las matrices de la cámara (déle una Z inicial de la distancia del plano de visión cercana, debe terminar con un desplazamiento en el plano cercano). Esto le da el vector de movimiento del mouse en el espacio mundial. Proyecte ese vector en el eje deseado. Esto te da el movimiento en el espacio mundial. El objeto se moverá hacia donde señaló el usuario, independientemente de la orientación del objeto. Si el eje es principalmente vertical, se necesita un movimiento vertical para moverlo.

También puede tomar el punto inicial y final del mouse en el espacio de la pantalla, proyectar ambos y, a partir de eso, calcular el vector de movimiento espacial mundial. Yo no, pero es muy fácil que lo encuentres.

Otra opción es tomar el poder del movimiento del mouse, para que los movimientos más rápidos causen desplazamientos más grandes.

Usando una variante de la primera opción, también puede tomar el puntero para que el usuario pueda mover continuamente su mouse (levantándolo y retrocediendo). Eso es especialmente popular para los controles de rotación y escala.


Técnica interesante De todos modos, sería bueno saber si la técnica RobCurr también es válida (me parece, pero no hay votos negativos o positivos ...)
tigrou

Mientras lo leo, dice lo mismo que una de las opciones que mencioné. Calcule los puntos finales proyectados y forme un vector en el espacio mundial, proyectándolo en el eje deseado. Él acaba de enumerar algunas matemáticas confusas para la proyección vectorial.
Sean Middleditch

0

Probablemente proyectaría los puntos finales del eje seleccionados en el espacio 2d, los restaría para producir un vector 2d. Luego tome el producto escalar del vector normalizado del movimiento del mouse 2D con el primer vector normalizado para determinar la porción de movimiento que se debe aplicar.

Básicamente, calcula 2 vectores:

Va = diferencia normalizada de los puntos finales del eje proyectado

Vb = vector normalizado creado a partir del movimiento del mouse delta x e y

Va.Vb = | Va || Vb | cos @

Va.Vb / (| Va | Vb |) = cos @ - que es el componente del movimiento del mouse que debe aplicarse a lo largo del eje.

Solo otra opción.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.