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:
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 much
l'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)
Réponses:
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.
la source
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.
la source