Ich mache einen kleinen 3D-Szeneneditor (mit dem nur Objektpositionen geändert werden können).
Jedes Objekt wird mit einer 3D-X / Y / Z-Achse gezeichnet:
So funktioniert es: Der Benutzer wählt eine Achse (X, Y oder Z) aus, indem er mit der linken Maustaste darauf klickt. Wenn er die linke Maustaste gedrückt hält, bewegt er die Maus (um das Objekt in Achsenrichtung zu bewegen). Das Kommissionieren ist bereits in Ordnung, aber ich möchte wissen, dass how much
das Objekt je nach 2D-Mausbewegung für die ausgewählte Achse übersetzt werden soll.
In diesem Beispiel sollte die Auswahl der X-Achse und das Bewegen der Maus von links nach rechts eine größere Verschiebung ergeben als das Auf- und Abbewegen (fast Null für dieses Bild).
Es muss wirklich einfach sein, aber ich kann es nicht herausfinden.
Die Eingabe sollte sein: Mausverschiebung seit dem ersten Linksklick (2D-Vektor), ausgewählter Achsenvektor (3D-Vektor), Modellansicht / Projektionsmatrix.
Ausgabe: Betrag (float oder double)
Antworten:
Wie soll sich das verhalten? Es gibt verschiedene Möglichkeiten, dies zu tun.
Eine einfache Option besteht darin, das Objekt nur um eine feste Anzahl von Weltraumeinheiten für jede Bildschirmraumeinheit (z. B. Pixel) zu bewegen, die die Maus bewegt.
Eine andere Möglichkeit besteht darin, den Vektor der Mausbewegung durch die normalen Projektions- / Kameramatrizen auf die Bewegungsachse zu projizieren. Projizieren Sie den Mausbewegungsvektor über die inversen Ansichtsfenster-, Projektions- und Kameramatrizen (geben Sie ihm ein anfängliches Z für den Abstand der Nahsichtebene, Sie sollten einen Versatz in der Nahsichtebene erhalten). Dies gibt Ihnen den Mausbewegungsvektor im Weltraum. Projizieren Sie diesen Vektor auf die gewünschte Achse. Dies gibt Ihnen die Bewegung im Weltraum. Das Objekt bewegt sich dorthin, wo der Benutzer gezeigt hat, unabhängig davon, in welcher Ausrichtung sich das Objekt befindet. Wenn die Achse größtenteils vertikal ist, ist eine vertikale Bewegung erforderlich, um sie zu bewegen.
Sie können auch einfach den Start- und Endmauspunkt im Bildschirmbereich nehmen, beide projizieren und daraus den Bewegungsvektor des Weltraums berechnen. Ich nicht, aber Sie finden das vielleicht einfacher.
Eine andere Möglichkeit besteht darin, die Mausbewegung zu aktivieren, sodass schnellere Bewegungen größere Offsets verursachen.
Mit einer Variante der ersten Option können Sie auch den Zeiger greifen, damit der Benutzer seine Maus kontinuierlich bewegen kann (indem er sie auf und ab nimmt). Dies ist besonders beliebt bei Rotations- und Skalierungssteuerungen.
quelle
Ich würde wahrscheinlich die ausgewählten Achsenendpunkte in den 2D-Raum projizieren und sie subtrahieren, um einen 2D-Vektor zu erzeugen. Nehmen Sie dann das Punktprodukt des normalisierten Vektors der 2d-Mausbewegung mit dem normalisierten ersten Vektor, um den Teil der Bewegung zu bestimmen, der angewendet werden soll.
Berechnen Sie also im Grunde 2 Vektoren:
Va = normalisierte Differenz der projizierten Achsenendpunkte
Vb = normalisierter Vektor, der aus dem Mausbewegungsdelta x und y erzeugt wird
Va.Vb = | Va || Vb | cos @
Va.Vb / (| Va | Vb |) = cos @ - Dies ist die Komponente der Mausbewegung, die entlang der Achse angewendet werden soll.
Nur eine weitere Option.
quelle