Wie konvertiere ich eine 2D-Bewegung (von der Maus) in eine Verschiebung entlang einer 3D-Achse?

8

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:

Geben Sie hier die Bildbeschreibung ein

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 muchdas 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)

Tigrou
quelle
Sie können die Richtung vergleichen, in die der Benutzer die Maus relativ zum Objekt bewegt, indem Sie die Objektausrichtung mit der Kameraausrichtung vergleichen.
MichaelHouse

Antworten:

5

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.

Sean Middleditch
quelle
Interessante Technik. Wie auch immer, es wäre schön zu wissen, ob die RobCurr-Technik auch gültig ist (es scheint mir, aber es gibt keine Abwärts- oder Aufwärtsstimmen ...)
Tigrou
Während ich es lese, sagt er dasselbe wie eine Option, die ich aufgelistet habe. Berechnen Sie projizierte Endpunkte und bilden Sie einen Vektor im Weltraum, der auf die gewünschte Achse projiziert wird. Er hat nur einige verwirrende Mathematik für die Vektorprojektion aufgelistet.
Sean Middleditch
0

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.

RobCurr
quelle