Comment convertir un mouvement 2D (depuis la souris) en un déplacement le long d'un axe 3D?

8

Je fais un petit éditeur de scène 3D (qui ne permet que de modifier la position des objets).

Chaque objet est dessiné avec un axe 3D X / Y / Z:

entrez la description de l'image ici

Comment ça marche: l'utilisateur choisit un axe (X, Y ou Z) en cliquant dessus avec le bouton gauche, puis, tout en maintenant le clic gauche, il déplace la souris (pour déplacer l'objet dans la direction de l'axe). la cueillette est déjà ok, mais je voudrais savoir que how muchl'objet doit être traduit pour l'axe sélectionné, en fonction du mouvement de la souris 2D.

Par exemple, sur cette image, sélectionner l'axe X et déplacer la souris de gauche à droite devrait donner un déplacement plus important que de le déplacer de haut en bas (presque zéro pour celle-ci)

Cela doit être vraiment simple mais je ne peux pas le comprendre.

L'entrée doit être: le déplacement de la souris depuis le premier clic gauche (vecteur 2D), le vecteur d'axe sélectionné (vecteur 3d), la matrice de visualisation / projection du modèle.

Sortie: montant (flottant ou double)

tigrou
la source
Vous pouvez comparer la direction dans laquelle l'utilisateur déplace la souris par rapport à l'objet en comparant l'orientation de l'objet par rapport à l'orientation de la caméra.
MichaelHouse

Réponses:

5

Comment voulez-vous que cela se comporte? il y a différentes facons de faire cela.

Une option simple consiste à déplacer simplement l'objet d'un certain nombre d'unités spatiales universelles pour chaque unité spatiale d'écran (pixel, par exemple) que la souris déplace.

Une autre option consiste à prendre le vecteur de mouvement de la souris et à le projeter sur l'axe de mouvement à travers les matrices normales de projection / caméra. Projetez le vecteur de mouvement de la souris via les matrices de vue inverse, de projection et de caméra (donnez-lui un Z initial de la distance du plan de vue proche, vous devriez vous retrouver avec un décalage sur le plan proche). Cela vous donne le vecteur de mouvement de la souris dans l'espace mondial. Projetez ce vecteur sur l'axe souhaité. Cela vous donne le mouvement dans l'espace mondial. L'objet se déplacera à l'endroit indiqué par l'utilisateur, quelle que soit l'orientation de l'objet. Si l'axe est principalement vertical, il faut un mouvement vertical pour le déplacer.

Vous pouvez également simplement prendre le point de départ et de fin de la souris dans l'espace de l'écran, projeter les deux et calculer le vecteur de mouvement de l'espace mondial. Je ne le sais pas, mais vous trouverez peut-être cela plus facile.

Une autre option consiste à prendre le pouvoir du mouvement de la souris, donc des mouvements plus rapides provoquent des décalages plus importants.

En utilisant une variante de la première option, vous pouvez également saisir le pointeur afin que l'utilisateur puisse déplacer continuellement sa souris (la ramasser de haut en bas). C'est particulièrement populaire pour les contrôles de rotation et d'échelle.

Sean Middleditch
la source
Technique intéressante. Quoi qu'il en soit, ce serait bien de savoir si la technique RobCurr est également valable (il me semble mais il n'y a pas de down ou upvotes ...)
tigrou
En le lisant, il dit la même chose que l'une des options que j'ai énumérées. Calculez les points d'extrémité projetés et formez un vecteur dans l'espace mondial, en le projetant sur l'axe souhaité. Il vient d'énumérer quelques mathématiques déroutantes pour la projection vectorielle.
Sean Middleditch
0

Je projetterais probablement les points d'extrémité d'axe sélectionnés dans un espace 2D, je les soustrais pour produire un vecteur 2D. Prenez ensuite le produit scalaire du vecteur normalisé du mouvement de la souris 2d avec le premier vecteur normalisé pour déterminer la portion de mouvement qui doit être appliquée.

Donc, en gros, calculez 2 vecteurs:

Va = différence normalisée des extrémités de l'axe projeté

Vb = vecteur normalisé créé à partir du delta de mouvement de la souris x et y

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

Va.Vb / (| Va | Vb |) = cos @ - qui est la composante du mouvement de la souris qui doit être appliquée le long de l'axe.

Juste une autre option.

RobCurr
la source