Come trovare un vettore normale che punta direttamente dal mondo virtuale allo schermo in Java3D?
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?
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.