Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.10.2011, 09:26

3D-Objekt in 2D-Bildschirmkoordinaten transformieren

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.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

03.10.2011, 10:17

Wenn ich das richtig verstehe, hast du es da zwangsweise mit einem System nichtlinearer Gleichungen zu tun. Denn du suchst ja Punkte auf den Geraden, die definierte Abstände zueinander haben. Es wird im allgemeinen mehrere Lösungen oder keine Lösung geben.

Mir ist nicht ganz klar, was du durch diese Platzierungsmethode erreichen willst. Für den Benutzer stell ich mir das äußerst unpraktisch vor!?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (03.10.2011, 10:26)


3

03.10.2011, 10:56

Ja, da hast Du recht. Ich bin noch am ueberlegen, ob sich das nichtlineare Problem analytisch loesen laesst.

Der Zweck dient einer einfacheren (ok - es ist ein Versuch) und praeziseren Bedienung, ich versuche, eine genaue Plazierung benutzerfreundlich zu gestalten, indem ich die Moeglichkeit biete, Vertexe direkt zu plazieren.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

03.10.2011, 10:58

Inwiefern ist denn damit eine "genaue Platzierung" möglich!?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

03.10.2011, 14:01

Einfach stelle ich mir das platzieren eines Objekts mit einem Klick vor und danach rotieren, skalieren usw.
Also Mittelpunkt setzen, dann 3 Achsen am Objekt über die ich rotieren uns skalieren kann. So wie z.B. bei Blender.

6

06.10.2011, 04:04

Falls das Thema noch jemand anderen interessieren sollte (im Internet habe ich nach wie vor nichts brauchbares oder im Sande verlaufende Threads gefunden):
Die Gleichungen vereinfachen sich etwas, wenn man annimmt, dass alle Strahlen den selben Ursprung haben (die Position der GL-Kamera). Anschliessend erstellt man drei Gleichungen f1(x,y,z), f2(x,y,z), f3(x,y,z) - ich habe dazu die Abstaende zwischen den Strahlen genommen.
Ein einfacher numerischer Gleichungsloeser (ich habe das ganz einfache Newton-Verfahren verwendet) fuehrt dann zumindest mal zu einer mathematisch korrekten Loesung. Jetzt werde ich die Sache mal in meinen Editor integrieren und dann werden froehlich Welten gebastelt :D
Ich werde Euch dann ueber den Nutzen des Verfahrens auf dem Laufenden halten, ich habs ja selber noch nicht probiert.

Werbeanzeige