2008-09-02 8 views
1

Je pense que cela peut être fait en appliquant la matrice de transformation de la scenegraph à z-normal (0, 0, 1), mais cela ne fonctionne pas. Mon code va comme ceci:Comment trouver un vecteur normal pointant directement du monde virtuel à l'écran dans Java3D?

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

Alors j'ai essayé quelque chose comme ça aussi:

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(); 

Mais encore cela ne fonctionne pas correctement. Je pense qu'il doit y avoir un moyen facile de créer un tel vecteur. Savez-vous ce qui ne va pas avec mon code ou une meilleure façon de le faire?

Répondre

0

Oui, vous avez ma bonne question. Désolé que j'étais un peu confus hier. Maintenant j'ai corrigé le code en suivant votre suggestion et en mélangeant deux morceaux de code dans la question ensemble:

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

Merci.

2

Si je comprends bien, vous voulez un vecteur qui soit normal au plan de l'écran, mais en coordonnées mondiales?

Dans ce cas, vous voulez INVERT la transformation de World -> Screen and do Screen -> World de ou (0,0,1) selon quel axe le fait écran vers le bas. Puisque la matrice ModelView est juste une matrice de rotation (en ignorant la partie de transformation homogène), vous pouvez simplement extraire ceci en prenant la transposition de la partie rotationnelle, ou en la lisant simplement dans la rangée du bas - comme cela se transpose sur la Z colonne de coordonnées sous la transposition.

Questions connexes