Wo befindet sich ein Punkt?

Servus, es geht zwar nicht um die Programmierung eines Spiels, aber um ein Thema, das besonders in diesem Bereich zu finden ist, daher schreib ich das mal hier rein, hoffe das passt :)
Also, folgende Situation: Ich habe eine Kamera mit einer Position im 3-dimensionalen Raum, sowie einen Richtungsvector, der aufzeigt in welche Richtung die Kamera gerade schaut. Diese Kamera hat ein variables Sichtfeld, sagen wir mal 90° in die Breite, also in jede Richtung 45, und 60° in die Höhe.
Dann hab ich noch einen Punkt mit eine Position, und jetzt will ich wissen wo auf dem Bildschirm sich dieser Punk befindet. Dafür habe ich jetzt 2 Winkel ausgerechnet, den zwischen dem Richtungsvektor der Kamera und dem Punkt mit der Kamera als Ursprung, auf der xy- Ebene um die x-Koordinate des Punktes auf dem Bildschirm zu bestimmen, und das gleiche auf der yz-Ebene um die y-Koordinate zu bestimmen. Das Verhältnis der Winkel zu den 45° bzw. 30° habe ich dann auf den Bildschirm übertragen. Ich hoffe bisher kann mir jeder folgen.

Das funktioniert jetzt allerdings nur sehr bedingt, denn nur mit den Winkeln kann der Punkt ja sowohl links, als auch rechts, bzw. ober- und unterhalb der Richtungsvektors der Kamera liegen. Wie kann ich jetzt möglichst ressourcensparend festlegen wo genau der Punkt jetzt am Bildschirm hin muss?
Meine Idee war es einen weiteren Vektor festzulegen, der die obere, linke Ecke des Sichtfeldes der Kamera beschreibt und dann, je nachdem ob der Winkel des Punktes zu diesem Vektor größer oder kleiner als zum Richtungsvektor der Kamera ist, kann man erkennen in welches "Quartal" des Bildschirms der Punkt gehört. Allerdings klingt das nicht sehr effektiv und mir fehlen leider die entsprechenden Formeln um diesen zweiten Vektor zu bestimmen :(

Also gibt es hier eine bessere Lösung? Oder kennt jemand sogar allgemein für die Ganze Geschichte einen schöneren Weg?

Kurz zusammengefasst: Ich will eigentlich nur Punkte in einem 3-dimensionalen Koordinatensystem auf einen 2-dimensionalen Bildschirm übertragen.


Grüße M
 

DrZoidberg

Top Contributor
Am besten ist es du übersetzt die Koordinaten des Punktes erst einmal in das Koordinatensystem der Kamera. Im dem System liegt der Ursprung in der "Linse" der Kamera und die Z Achse zeigt von der Kamera weg. Die XY Ebene ist daher parallel zum virtuellen Bildschirm, der sich hinter der Kamera befindet.
In diesem Koordinatensystem ist die Projektion des Punktes dann trivial über den Dreisatz möglich.
Du benötigst für das ganze entweder eine Drehmatrix oder ein Quaternion, das die Rotation der Kamera relativ zum normalen Koord.System des Spiels beschreibt.
Wie führst du denn Rotationen in deinem Spiel bisher durch?
 

httpdigest

Top Contributor
Für eine solche perspektivische Projektion kannst du reine Lineare Algebra anwenden und brauchst dich an keiner Stelle mit Trigonometrie/Winkeln herumschlagen, die alles nur unnötigen kompliziert machen.
Sowas wird ja zu Haufe in OpenGL/Direct3D gemacht. Hier mal ein paar sehr gute Lernmaterialien:
- http://www.songho.ca/opengl/gl_projectionmatrix.html
- https://www.scratchapixel.com/lesso...n-matrix/opengl-perspective-projection-matrix

Und hier ein kleines Code-Beispiel, um einen Punkt zu projizieren (mit JOML als Bibliothek für die ganzen Berechnungen):
Java:
// Vertikaler Öffnungswinkel der Kamera
float fovY = (float) Math.toRadians(60.0);
// width/height des Viewports der Kamera
float aspectRatio = (float) 800 / 600;
// 4x4-Matrix für Transformation von Weltkoordinaten -> Kamerakoordinaten -> Einheitswürfel/NDC
Matrix4f m = new Matrix4f()
  // Erzeuge perspektivische Projektion mit 0.1 als Entfernung zur "near plane" und unendlich weiter "far plane"
  .perspective(fovY, aspectRatio, 0.1f, Float.POSITIVE_INFINITY)
  // Erzeuge Transformation von Weltkoordinaten in Kamerakoordinaten (Drehung und Translation)
  .lookAt(camX, camY, camZ, // <- Position der Kamera
          lookAtX, lookAtY, lookAtZ, // <- Punkt, auf den die Kamera schaut
          upX, upY, upZ); // <- welche Richtung ist "oben" für die Kamera
// Vektor für den zu projizierenden Punkt
Vector3f point = new Vector3f(point, pointY, pointZ);
// Transformiere den Punkt in "Normalized Device Coordinates" (NDC)
m.transformProject(point);
// point.xyz ist in ([-1..1], [-1..1], [-1..1]), wenn er von der Kamera "gesehen" wird
 
Am besten ist es du übersetzt die Koordinaten des Punktes erst einmal in das Koordinatensystem der Kamera. Im dem System liegt der Ursprung in der "Linse" der Kamera und die Z Achse zeigt von der Kamera weg. Die XY Ebene ist daher parallel zum virtuellen Bildschirm, der sich hinter der Kamera befindet.
In diesem Koordinatensystem ist die Projektion des Punktes dann trivial über den Dreisatz möglich.
Du benötigst für das ganze entweder eine Drehmatrix oder ein Quaternion, das die Rotation der Kamera relativ zum normalen Koord.System des Spiels beschreibt.
Wie führst du denn Rotationen in deinem Spiel bisher durch?

Wie kann ich denn meinen Punkt in das Koordinatensystem der Kamera übersetzen? Ganz praktisch jetzt? Ich kann mir darunter nicht so viel vorstellen wie das gehen soll :/
Rotationen führe ich bisher über die beschriebene Methode durch, mit Kommandozeilen-eingaben, das soll wie gesagt kein Spiel werden,
 

httpdigest

Top Contributor
Wenn du das alternativ _wirklich_ verstehen willst, benötigst du Wissen über Vektorräume, Linear Algebra im Allgemeinen, Koordinatensysteme und Matrix/Vektor-Transformationen (und, falls doch mit Quaternionen, dann eben die auch noch :) ).
Ich hatte dir ja bereits ein paar Quellen genannt, die ausführlichst beschreiben, wie man mit Hilfe von homogenen Koordinaten perspektivische Projektion hinbekommt. Im Grunde steckt da nicht viel mehr dahinter, als der von @DrZoidberg angesprochene berühmte Dreisatz.
Für affine Koordinatensystemtransformationen kannst du dir mal die folgenden Quellen anschauen:
- https://www.uio.no/studier/emner/ma...F3320/h03/undervisningsmateriale/lecture3.pdf
- https://www.khanacademy.org/math/precalculus/precalc-matrices#matrices-as-transformations
- https://www.khanacademy.org/math/linear-algebra/matrix-transformations
Hierbei ist absolut nichts nur speziell für Spiele. Das sind ganz allgemeine 3D-Transformationen und Projektion, die in jeder 3D-Anwendung (wie auch immer geartet - egal ob mit Kommandozeile oder GUI) benutzt werden.
 

Hutzli

Aktives Mitglied
Für die Quaternioneninteressierten: Ich habe letztes Semester mit einem Studienkollegen nebenbei was darüber zusammengetragen. Enthält auch die komplette Herleitung der Rotationsmatrix mit Beispielen. Das Deutsch ist schrecklich, ich hatte aber keine Zeit mehr, Korrektur zu lesen. Falls jemand einen Fehler finden sollte, bitte ich um Rückmeldung. Sollte jedoch, soweit ich's beurteilen kann, alles korrekt sein. Vielen Dank ;)
 

Anhänge

  • Quaternionen.pdf
    855,5 KB · Aufrufe: 10
Ähnliche Java Themen
  Titel Forum Antworten Datum
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
R Memory - Nicht alle Button lassen sich aktivieren? Spiele- und Multimedia-Programmierung 1
P Sich bewegende Kamera Spiele- und Multimedia-Programmierung 12
N der Player bewegt sich nicht Spiele- und Multimedia-Programmierung 14
R Game Loop verhält sich eigenartig Spiele- und Multimedia-Programmierung 1
A Spielball bewegt sich nicht richtig, prallt falsch ab Spiele- und Multimedia-Programmierung 7
Blender3D VLCJ Video lässt sich nicht mehr abspielen nach mysql Installation Spiele- und Multimedia-Programmierung 1
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
S Animation zieht "Spur" hinter sich her Spiele- und Multimedia-Programmierung 2
M Bildschirmgröße ändert sich Spiele- und Multimedia-Programmierung 10
M Würdet ihr sagen Java Applets eignen sich gut Spiele- und Multimedia-Programmierung 5
J Java3D - Farben vermischen sich Spiele- und Multimedia-Programmierung 7
E [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt Spiele- und Multimedia-Programmierung 31
CookieSoft 3D Würfel will sich nicht drehen! [LWJGL] Spiele- und Multimedia-Programmierung 2
M Beim schießen richtet sich die Kugel nach der Maus aus (Quaternion) Spiele- und Multimedia-Programmierung 5
J Pufferproblem bei sich wiederholenden MouseEvents Spiele- und Multimedia-Programmierung 4
T JOGL im OrthoMode und Texturen verfärben sich Spiele- und Multimedia-Programmierung 3
S Programm hängt sich auf wenn Lied abspielt Spiele- und Multimedia-Programmierung 4
W 2 Bälle, die sich abstoßen Spiele- und Multimedia-Programmierung 24
F RPG - Spielfigur soll sich nicht frei bewegen können. Anregugen wären gerne gesehen^^ Spiele- und Multimedia-Programmierung 13
Ivan Dolvich [LWJGL] Texturen überlagern sich Spiele- und Multimedia-Programmierung 2
P JFileChooser öffnet sich drei mal Spiele- und Multimedia-Programmierung 4
Dragonfire Java Sound API - Lautstärke ändert sich nicht Spiele- und Multimedia-Programmierung 2
H Jogl-Animator - Inhalt ändert sich nicht Spiele- und Multimedia-Programmierung 4
M Sich nach links verschiebendes Bild Spiele- und Multimedia-Programmierung 2
L Figur soll sich selbständig Bewegen Spiele- und Multimedia-Programmierung 12
S Polygon bewegt sich nach mehreren aufrufen immer schneller Spiele- und Multimedia-Programmierung 3
B Bounds drehen sich nicht mit.... Spiele- und Multimedia-Programmierung 7
R Eignet sich Java für ein Beat'em'Up? Spiele- und Multimedia-Programmierung 3
R Kreuz lässt sich nicht zeichnen Spiele- und Multimedia-Programmierung 11
S Punkt auf Linie Spiele- und Multimedia-Programmierung 5
P Winkel von einem Punkt zum anderen berechnen Spiele- und Multimedia-Programmierung 9
A Wann ist ein Punkt inerhalb eines Polygons? Spiele- und Multimedia-Programmierung 2
C Java3D Rotation um einen Punkt (y-achse) Spiele- und Multimedia-Programmierung 2
Developer_X Punkt-Winkel Berechnung Spiele- und Multimedia-Programmierung 3
Developer_X Colisionserkennung Punkt -> Linie || Linie -> Linie Spiele- und Multimedia-Programmierung 5
C JAVA3D Rotation um einen bestimmten Punkt Spiele- und Multimedia-Programmierung 20
hdi 3d punkt -> 2d punkt Spiele- und Multimedia-Programmierung 10
G Wie bekomme ich einen Punkt (Graphics) Spiele- und Multimedia-Programmierung 2
G Punkt in Image auf Transparenz prüfen Spiele- und Multimedia-Programmierung 6
G gezeichnete Elemente überprüfen ob sie ein Punkt xy abdecken Spiele- und Multimedia-Programmierung 3
A Einfacher bewegter Punkt im Frame Spiele- und Multimedia-Programmierung 6
S Punkt berechnen, nach Rotation Spiele- und Multimedia-Programmierung 2
L Punkt im 3D-Raum Spiele- und Multimedia-Programmierung 2
R Wie zeichne ich einen einzelnen Punkt Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben