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:
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 much
el 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)
Respuestas:
¿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.
fuente
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.
fuente