Come posso convertire un movimento 2D (dal mouse) in uno spostamento lungo un asse 3d?


8

Sto realizzando un piccolo editor di scene 3D (che consente solo di modificare le posizioni degli oggetti).

Ogni oggetto viene disegnato con un asse X / Y / Z 3d:

inserisci qui la descrizione dell'immagine

Come funziona: l'utente sceglie un asse (X, Y o Z) facendo clic con il tasto sinistro su di esso, quindi, tenendo premuto il tasto sinistro, sposta il mouse (per spostare l'oggetto nella direzione dell'asse). la raccolta è già ok, ma vorrei sapere che how muchl'oggetto dovrebbe essere tradotto per l'asse selezionato, a seconda del movimento del mouse 2D.

Ad esempio, in questa immagine, la selezione dell'asse X e lo spostamento del mouse da sinistra a destra dovrebbero dare uno spostamento maggiore rispetto allo spostamento verso l'alto (quasi zero per questo)

Deve essere davvero semplice ma non riesco a capirlo.

L'input dovrebbe essere: spostamento del mouse dal primo clic sinistro (vettore 2D), vettore dell'asse selezionato (vettore 3d), matrice vista modello / proiezione.

Output: quantità (float o double)


È possibile confrontare la direzione in cui l'utente sta spostando il mouse rispetto all'oggetto confrontando l'orientamento dell'oggetto e l'orientamento della telecamera.
MichaelHouse

Risposte:


5

Come vuoi che si comporti? Esistono diversi modi per farlo.

Un'opzione semplice è semplicemente spostare l'oggetto di un numero fisso di unità spaziali mondiali per ogni unità spaziale dello schermo (pixel, diciamo) che il mouse muove.

Un'altra opzione è prendere il vettore del movimento del mouse e proiettarlo sull'asse del movimento attraverso le normali matrici di proiezione / videocamera. Proiettare il vettore di movimento del mouse tramite la vista inversa, la proiezione e le matrici della videocamera (assegnargli una Z iniziale della distanza del piano di vista ravvicinata, si dovrebbe finire con un offset sul piano vicino). Questo ti dà il vettore di movimento del mouse nello spazio mondiale. Proiettare quel vettore sull'asse desiderato. Questo ti dà il movimento nello spazio del mondo. L'oggetto si sposterà nel punto indicato dall'utente, indipendentemente dall'orientamento verso cui si trova l'oggetto. Se l'asse è per lo più verticale, sono necessari movimenti verticali per spostarlo.

Puoi anche prendere il punto iniziale e finale del mouse nello spazio dello schermo, proiettare entrambi e da quel punto calcolare il vettore di movimento dello spazio mondiale. Non lo so, ma potresti trovare più facile.

Un'altra opzione è prendere una potenza del movimento del mouse, quindi movimenti più veloci causano offset più grandi.

Usando una variante della prima opzione, puoi anche afferrare il puntatore in modo che l'utente possa spostare continuamente il mouse (selezionandolo su e giù). Questo è particolarmente popolare per i controlli di rotazione e scala.


Tecnica interessante. Ad ogni modo, sarebbe bello sapere se anche la tecnica RobCurr è valida (mi sembra ma non ci sono down o upgrade ...)
tigrou,

Mentre lo leggo, sta dicendo la stessa cosa di un'opzione che ho elencato. Calcola i punti finali proiettati e forma un vettore nello spazio mondiale, proiettandolo sull'asse desiderato. Ha appena elencato un po 'di matematica confusa per la proiezione vettoriale.
Sean Middleditch,

0

Probabilmente proietterei gli endpoint degli assi selezionati nello spazio 2D, sottraendoli per produrre un vettore 2D. Quindi prendi il prodotto punto del vettore normalizzato del movimento del mouse 2d con il primo vettore normalizzato per determinare la porzione di movimento che dovrebbe essere applicata.

Quindi, in sostanza, calcola 2 vettori:

Va = differenza normalizzata degli endpoint degli assi proiettati

Vb = vettore normalizzato creato dal delta del movimento del mouse x e y

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

Va.Vb / (| Va | Vb |) = cos @ - che è il componente del movimento del mouse che dovrebbe essere applicato lungo l'asse.

Solo un'altra opzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.