Ich bin nicht sicher, wie man von Bildschirmkoordinaten zu Weltkoordinaten kommt. Ich benutze VisPy und möchte Raytracing und Picking in 3D implementieren.
Ich habe Code basierend auf einem Würfelbeispiel vorbereitet. Der folgende Code sendet einen Rohstrahl durch Ändern des Z-Werts durch den Bildschirm und druckt 3D-Koordinaten (in der Methode "on_mouse_press"). Die Ergebnisse sind jedoch nicht korrekt. Wenn ich an der oberen rechten Ecke des Würfels irgendwo entlang des Strahls klicke, sollte (3,3,3) gedruckt werden, ist es aber nicht. Kann mir jemand dabei helfen?
%Vor%Ein angeklickter Punkt auf dem Bildschirm entspricht einer Linie in Ihrer Szene.
Das Objekt in view.scene.transform
repräsentiert die Zuordnung zwischen Szenen- und Bildschirmkoordinaten. .map(points)
transformiert Punkte von Szene zu Bild. .imap(points)
bildet von Bildschirmkoordinaten zurück zu Weltkoordinaten.
Um die Zeile zu erhalten, der Ihr Bildschirmpunkt entspricht. Sie können einen Punkt auf dem Bildschirm und einen anderen Punkt auf dem Bildschirm in z:
einfügen %Vor%Ich passte es etwas näher an, was Sie wollen; Sie müssen screen_center durch den angeklickten Punkt ersetzen. Beachten Sie, dass ich dies für die orthogonale Projektion getan habe; denke, es funktioniert auch für die Perspektive, aber habe es nicht getestet.
Related: Erhalten Sie Blickrichtung relativ zur Szene in Vispy?
Ich bin nicht sicher über den tatsächlichen Code, der dazu benötigt wird, aber konzeptionell würde ich so etwas lösen.
Wenn Sie auf ein Pixel auf dem Bildschirm klicken, wählen Sie im Wesentlichen einen X-, Y-Punkt aus, der als Ihre Ansichtskamera gilt. Dies bedeutet, dass der Rest der erforderlichen Transformationen und Drehung von der Kamera gefunden wird.
Holen Sie sich also die Positions- und Rotationsdaten der Kamera, fügen Sie die relative x, y-Transformation aus Ihrem Ansichtsfenster hinzu und zeichnen Sie dann eine Kurve, die den Vorwärtsvektor von Ihrer Position verwendet, der linear auf den gewünschten Punkt zeigt. Dann, wenn diese Spur trifft, hol das Objekt.
Wenn Sie die relative Transformation nicht hinzufügen, wird die Spur aus der Mitte des Darstellungsbereichs abgerufen. Da die Rotationsdaten für alle Punkte im Darstellungsbereich identisch sind, müssen Sie nur die Differenz in x hinzufügen , y zwischen, wo Sie von der Mitte x, y geklickt haben.
Denken Sie auch daran, dass für das Ansichtsfenster "X" wirklich der Auslösewert für Gieren, Nicken, Rollen (Welt) oder einfach Gieren, Neigen (relativ) und für "Y" die Z-Achse ist.
Ich hoffe meine Erklärung war klar, ich habe dieses Bild auch hinzugefügt, um den Überblick weiter zu demonstrieren. Hoffe das hilft!
Tags und Links python visualization 3d pyopengl vispy