2009-05-26 12 views
7

Ich mache eine hinter den Kulissen 3D-Simulation beim Rendern der Welt in meiner 2D-isometrischen Engine. Ich habe noch nie eine isometrische Engine gemacht, und meine Matrix Mathe ist im Allgemeinen rostig, also habe ich Probleme.Unprojected ein on-Screen-Punkt zurück zu einer isometrisch projizierten Welt

Ich habe eine Projektions-Matrix, die in ihrer einfachsten Form ist dies:

0.7  0.35  0 
0  -0.87  0 
-0.71  0.35  1 

Ein paar Zeichen umgedreht werden, weil meine Motoren Koordinatensystem ist 0,0 in der oberen linken, mit + X auf die rechts/Osten und + Z nach Süden.

nun die Umkehrung davon ist:

1.4080 0.5670 0.0000 
0.0000 -1.1490 0.0000 
1.0000 0.8050 1.0000 

nun diese Matrizen meist Arbeit.

Zum Beispiel

WC: 500,0,500 = Screen: -1.44, 350, 500 (X und Y korrekt ist)

WC: 0,0,500 = Screen: -355, 175, 500 (X und Y ist korrekt wieder)

Aber jetzt, wenn Sie in die andere Richtung gehen müssen, Sie nicht mehr über den praktischen Z-Wert, so

Screen: -1,44, 350, 0 = WC: -2, -402,97, 0 (. Also, Müll)

Und vieles mehr - sobald ich den Z-Wert nicht mehr haben, Ich kann die Weltkoordinaten nicht von den Bildschirmkoordinaten abrufen.

Was ist die Problemumgehung hier?

EDIT

Ich möchte darauf hinweisen, dass der Punkt der unproject ist ein Strahl für Maus picking zu bekommen ..

Es scheint, wie es ist nur meine falschen Eindruck von dem, was ich war, das zu tun war Einschrauben ich hier oben.

+0

Irgendwelche Hinweise darauf, wie Sie bis hierher gekommen sind, wäre er sehr hilfreich! Ich versuche, etwas Ähnliches herauszufinden - eine 3D-Simulation hinter dem Vorhang, während 2D gerendert wird. –

+0

Ich konnte es herausfinden - Innerhalb von XNA können Sie diese Matrizen einfach mit Matrix.CreateOrthographic usw. Funktionen erstellen. –

Antwort

8

Wie Sie festgestellt haben, erfordert die Konvertierung in den 3D-Raum eine Art Z-Koordinate, um überhaupt einen Sinn zu ergeben.

Ich würde vorschlagen, dass Sie die umgekehrte Umwandlung zweimal.Einmal mit einer Z-Koordinate in der Nähe des Bildschirms (am nächsten zum Beobachter) und einmal mit einer Z-Koordinate hinter der 3D-Szene. Diese zwei 3D-Punkte würden Ihnen eine 3D-Linie geben, die alle Positionen "hinter" diesem 2D-Punkt einnehmen würde.

2

können Sie nicht. Sie projizieren auf den Bildschirm, der Informationen verliert.

Wenn Sie darüber nachdenken, werden mehrere 3D-Koordinaten auf den gleichen Punkt auf dem Bildschirm projiziert und wissen nur, dass die Bildschirmkoordinate nicht ausreicht, um die ursprüngliche Koordinate abzurufen. Wenn Sie Ihre Bildschirmkoordinaten betrachten, geben Sie ihnen alle z-Wert 0. Das bedeutet, dass die letzten Spalten Ihrer Projektionsmatrix nur Nullen haben sollten, wodurch diese Matrix nicht invertierbar wird.

2

Jedes Pixel auf dem Bildschirm repräsentiert eine Linie vom Auge des Betrachters in die imaginäre 3D-Welt hinter dem Bildschirm. Sie müssen diese Linie mit allen Objekten schneiden, die in dieser Welt lauern könnten, um 3D-Koordinaten zu erhalten.