Wie finde ich einen Normalenvektor, der in Java3D direkt von der virtuellen Welt auf den Bildschirm zeigt?

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich denke, dass dies durch Anwenden der Transformationsmatrix des Szenengraphen auf Z-Normal (0, 0, 1) möglich ist, aber es funktioniert nicht.Mein Code sieht so aus:

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

Dann habe ich auch so etwas probiert:

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

Aber das funktioniert immer noch nicht richtig.Ich denke, es muss eine einfache Möglichkeit geben, einen solchen Vektor zu erstellen.Wissen Sie, was mit meinem Code nicht stimmt, oder wissen Sie, wie ich das besser machen kann?

War es hilfreich?

Lösung 2

Ja, Sie haben meine Frage richtig verstanden.Tut mir leid, dass ich gestern etwas verwirrt war.Jetzt habe ich den Code korrigiert, indem ich Ihrem Vorschlag gefolgt bin und zwei Codeteile in der Frage zusammengemischt habe:

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

Danke schön.

Andere Tipps

Wenn ich das richtig verstehe, möchten Sie einen Vektor, der normal zur Bildschirmebene ist, aber in Weltkoordinaten?

In diesem Fall möchten Sie INVERT die Verwandlung von World -> Screen and do Screen -> World von (0,0,-1) oder (0,0,1) abhängig davon, auf welcher Achse der Bildschirm nach unten zeigt.

Da es sich bei der ModelView-Matrix nur um eine Rotationsmatrix handelt (wobei der homogene Transformationsteil ignoriert wird), können Sie diese einfach herausziehen, indem Sie die Transponierung des Rotationsteils vornehmen oder einfach in der unteren Zeile ablesen, wie dies auf die transponiert wird Z Koordinatenspalte unter Transposition.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top