Hallo allerseits,
ich arbeite momentan an einem Editor fuer meinen Flugsimulator und habe vor, eine Moeglichkeit anzubieten, ein Objekt mittels Mausklick in der 3D-Welt zu plazieren. Ich hoffe, Ihr koennt mir helfen, denn ich versuche schon seit Wochen, das Problem hinzukriegen und im Internet habe ich dazu nichts gefunden.
In der Theorie soll dies so funktionieren:
Der Benutzer waehlt auf dem einzufuegenden Objekt drei Vertexe aus, klickt anschliessend auf dem Bildschirm an die drei Stellen, an denen die gewaehlten Vertexe spaeter sitzen sollen - das Objekt soll dabei nur verschoben, im Ganzen skaliert oder rotiert werden.
Eine Methode, die mir anhand der Vertexe und Weltkoordianten eine passende Transformationsmatrix zusammenbastelt, habe ich bereits hinbekommen, nun will ich als darueberliegenden Schritt die Transformation von den Bildschirmkoordinaten zu den Weltkoordinaten erstellen.
Es handelt sich um eine perspektivische Projektion und meine Theorie sieht bisher folgendermassen aus:
1. Mittels gluUnproject() (rechnet mir die Bildschirmkoordinaten in Koordinaten im 3D-Raum um, damit laesst sich ein vom Bildschirm ausgehender Strahl konstruieren) erstelle ich mir fuer jeden gewaehlten Bildschirmpunkt einen Strahl, der in die 3D-Welt faellt. D.h., ich habe drei Strahlen mit jeweils einem berechneten Aufpunkt und Richtungsvektor. Aufgrund der perspektivischen Projektion sind die Richtungsvektoren alle mehr oder weniger unterschiedlich.
2. Nun nutze ich einfache geometrische Grundsaetze, um die Beziehungen, welche ich aus dem 3D-Modell des zu plazierenden Objekts herauslese, in der 3D-Welt umzusetzen:
- Einmal die Abstaende zwischen den drei Strahlen, die sich proportional zu den Abstaenden im Modell verhalten
- Das Skalarprodukt, um die Winkel zu erhalten.
Vorgehensweise:
- Drei gegebene Punkte aus dem 3D-Modell (P1, P2, P3)
- Drei bekannte Geraden (P1', P2', P3'), entstanden durch die Strahlen, die OpenGL mir berechnet hat (d.h. Aufpunkt und Richtungsvektor sind bekannt)
Zuerst geht es um die Relationen, d.h. ich baue mir Richtungsvektoren r1 = P2 - P1, r2 = P3 - P1, analog subtrahiere ich die Strahlen in der 3D-Welt.
Anwendung des Skalarprodukts:
r1*r2 / |r1|*|r2| = r1'*r2' / |r1'||r2'|
Skalierungsverhaeltnisse beachten:
|r1'|/|r1| = |r2'|/|r2|
Ich hatte nun zwei Ansaetze, der erste war, ich setze einen beliebigen Punkt auf der Geraden P1' und berechne einen Skalierungsfaktor fuer das Modell, die Alternative besteht darin, als Skalierung 1 anzunehmen (|r1| = |r1'|, |r2| = |r2'|) und stattdessen alle Skalare der Geraden als unbekannt darzustellen.
In beiden Faellen habe ich drei Unbekannte und drei Gleichungen, also sollte sich die Sache loesen lassen - allerdings ist die Mathematik in dem Bereich der Loesbarkeit ziemliches Neuland fuer mich.
In einfachen Zahlenbeispielen ist die Rechnung von Hand schnell erledigt, aber wenn ich eine allgemein gueltige Loesung herleiten moechte, um diese anschliessend zu programmieren, werden die Gleichungen sehr kompliziert und enden in einer Gleichung vierter Ordnung, die ich analytisch nicht loesen kann.
Ich habe es auch mal an meiner Hochschule mit MATLAB probiert, ob das mir vielleicht die Loesung hinzaubert, aber dort schaffe ich es nur zu einer numerischen Loesung.
Wenn ich richtig gedacht habe, gibt es zwei Loesungen, was fuer meine Zwecke aber ausreichend sein sollte.
Auf alle Faelle bin ich nun ziemlich ratlos, wie ich weiter verfahren soll, weiter hin- und herrechnen bringt mich nicht weiter. Was sind denn Eure Ideen?
Ich danke Euch schonmal im Voraus fuer Eure Hilfe.