Comment trouver un vecteur normal pointant directement du monde virtuel vers l'écran en Java3D ?

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

  •  09-06-2019
  •  | 
  •  

Question

Je pense que cela peut être fait en appliquant la matrice de transformation du graphe de scène à z-normal (0, 0, 1), mais cela ne fonctionne pas.Mon code ressemble à ceci :

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

Ensuite, j'ai aussi essayé quelque chose comme ceci :

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 cela ne fonctionne toujours pas correctement.Je pense qu'il doit y avoir un moyen simple de créer un tel vecteur.Savez-vous ce qui ne va pas avec mon code ou une meilleure façon de le faire ?

Était-ce utile?

La solution 2

Oui, vous avez bien répondu à ma question.Désolé d'avoir été 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 :

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.

Autres conseils

Si je comprends bien, vous voulez un vecteur 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 (0,0,-1) ou (0,0,1) en fonction de l'axe vers lequel l'écran pointe vers le bas.

Puisque la matrice ModelView n'est qu'une matrice de rotation (en ignorant la partie de transformation homogène), vous pouvez simplement l'extraire en prenant la transposition de la partie de rotation, ou en lisant simplement dans la rangée du bas - car cela se transpose sur le Z colonne de coordonnées en transposition.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top