Come trovare un vettore normale che punta direttamente dal mondo virtuale allo schermo in Java3D?

StackOverflow https://stackoverflow.com/questions/40028

  •  09-06-2019
  •  | 
  •  

Domanda

Penso che si possa fare applicando la matrice di trasformazione dello scenegraph a z-normal (0, 0, 1), ma non funziona.Il mio codice è questo:

Vector3f toScreenVector = new Vector3f(0, 0, 1);
Transform3D t3d = new Transform3D();
tg.getTransform(t3d); //tg is Transform Group of all objects in a scene
t3d.transform(toScreenVector);

Poi ho provato anche qualcosa del genere:

Point3d eyePos = new Point3d();
Point3d mousePos = new Point3d();
canvas.getCenterEyeInImagePlate(eyePos);
canvas.getPixelLocationInImagePlate(new Point2d(Main.WIDTH/2, Main.HEIGHT/2), mousePos); //Main is the class for main window.

Transform3D motion = new Transform3D();
canvas.getImagePlateToVworld(motion);
motion.transform(eyePos);
motion.transform(mousePos);

Vector3d toScreenVector = new Vector3f(eyePos);
toScreenVector.sub(mousePos);
toScreenVector.normalize();

Ma ancora questo non funziona correttamente.Penso che ci debba essere un modo semplice per creare tale vettore.Sai cosa c'è che non va nel mio codice o il modo migliore per farlo?

È stato utile?

Soluzione 2

Sì, hai capito bene la mia domanda.Mi spiace di essere stato un po' confuso ieri.Ora ho corretto il codice seguendo il tuo suggerimento e mescolando insieme due pezzi di codice nella domanda:

Vector3f toScreenVector = new Vector3f(0, 0, 1);

Transform3D t3d = new Transform3D();
canvas.getImagePlateToVworld(t3d);
t3d.transform(toScreenVector);

tg.getTransform(t3d); //tg is Transform Group of all objects in a scene
t3d.transform(toScreenVector);

Grazie.

Altri suggerimenti

Se ho capito bene, vuoi un vettore normale al piano dello schermo, ma in coordinate mondiali?

In tal caso lo vuoi INVERT la trasformazione da World -> Screen and do Screen -> World Di (0,0,-1) O (0,0,1) a seconda dell'asse su cui lo schermo punta verso il basso.

Poiché la matrice ModelView è solo una matrice di rotazione (ignorando la parte di trasformazione omogenea), puoi semplicemente estrarla prendendo la trasposizione della parte di rotazione o leggendo semplicemente nella riga inferiore, poiché questa si traspone sulla Z colonna di coordinate sotto trasposizione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top