JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=8b29359988b31c2621e7f36b5ff59de9Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Projection Transformation

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 18.05.2006, 06:01    Titel: Projection Transformation Antworten mit Zitat

Ich habe folgendes vor: Ich will die Mauskoordinaten mit den x/y-Bildschirmkoordinaten der Objekte einer 3D-Szene vergleichen, um zu entscheiden, ob sich ein Objekt in der Nähe der Maus befindet.

In der DirectX-Hilfe werden Matrizen mit 4 Zeilen und 4 Spalten verwendet.

Unter „3-D Transformations“ wird folgendes Schema verwendet:

M11 M12 M13 M14
M21 M22 M23 M24
M31 M32 M33 M34
M41 M42 M43 M44

Um einen Punkt zu transformieren wird folgendes angegeben:

x’ = (x * M11) + (y * M21) + (z * M31) + (1 * M41)
y’ = (x * M12) + (y * M22) + (z * M32) + (1 * M42)
z’ = (x * M13) + (y * M23) + (z * M33) + (1 * M43)

Unter: „What Is the Projection Transformation?” werden auch Werte für die Elemente in Spalte 4 verwendet.

Leider weiß ich nicht, wie ich in diesem Fall vorgehen muss, um Punkte zu transformieren, wenn die Elemente in Spalte 4 gesetzt sind (Zuvor habe ich world + view und projection matrix nacheinander miteinander multipliziert).

Ich hoffe, jemand weiß Rat.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 18.05.2006, 07:51    Titel: Antworten mit Zitat

Also generell macht man da ganze glaube ich anders herum.

Anstatt die Objekte per hand auf Bildschirmkoordinaten zu projezieren und mit der Maus zu vergleichen geht man folgenden Weg (Mathematisch):

- Man bildet die Inverse der Projektionsmatrix (Bzw dem Produkt aus world, view und proj) (Dazu sollte D3DX Funktionen geben).
- Man wendet die Inverse Projektionsmatrix auf die Mauskoordinaten an. Das Ergebnis ist eine Gerade (Bzw anschaulicher ein strahl der vom Monitor aus durch den Mauszeiger geht. Theoretisch könnten ja unendlich viele Objekte unter der Maus liegen die alle nur unterschieldich weit von dem Monitor entfernt sind)
- Dann sucht man Schnittpunkte dieses Strahls mit den Objekten.

Ansonsten um deine Frage direkt zu beantworten:
Die formel du die genannt hast ist die Formel um das Produkt zwischen einem Vektor und einer Matrix auszurechnen. Praktisch also um den Vektor auszurechnen der dabei herauskommt wenn du die Matrix auf den Vektor anwendest.

Ich verstehe nicht ganz wo das Problem liegt. Du solltest ja den Punkt kennen den du transformieren willst, also wirst du denke ich mal auch zugriff auf die Koordinaten (x, y, z) haben.
Genauso solltest du Zugriff auf die Komponenten der Matrix haben (M11...M44).
Also hast du doch alle Werte gegeben die du brauchst. Zumal du in diesem Fall auch nur x' und y' berechnen musst. Du kannst also die Formel fast so wie sie da steht in C++ übernehmen.
Oder du schaust in der Hilfe zu direct X ob es Funktionen gibt die das Produkt aus Matrix und Vektor ausrechnen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 18.05.2006, 18:32    Titel: Re: Projection Transformation Antworten mit Zitat

User_User hat Folgendes geschrieben:
x’ = (x * M11) + (y * M21) + (z * M31) + (1 * M41)
y’ = (x * M12) + (y * M22) + (z * M32) + (1 * M42)
z’ = (x * M13) + (y * M23) + (z * M33) + (1 * M43)

Unter: „What Is the Projection Transformation?” werden auch Werte für die Elemente in Spalte 4 verwendet.

Leider weiß ich nicht, wie ich in diesem Fall vorgehen muss, um Punkte zu transformieren, wenn die Elemente in Spalte 4 gesetzt sind

bei der (Zeilen-) Matrix gelten folgende Positionen:
M11, M22 und M33 sind für die Skalierung zuständig. Für die Rotation gilt:
um z-Achse: M11, M12, M21, M22
um y-Achse: M11, M13, M31, M33
um x-Achse: M22, M23, M32, M33
Die Plätze M41, M42 und M43 sind alleine für die Verschiebung (Translation) bestimmt. M14, M24 und M34 sind immer 0 und M44 ist immer 1. Diese sind ungenutzt. Du siehst, dass die Positionen für Skalierung und Rotation mitunter die gleichen Plätze in der Matrix verwenden Arrow sie sind voneinander abhängig. Da eine Verschiebung jedoch von der Ausrichtung her nichts mit Rotation und Skalierung zu tun hat (Verschiebung ist im World-Space, Rotation und Skalierung im lokalen Koordinatensystem; normalerweise) müssen für die Verschiebung ein paar extra Plätze reserviert sein. Das sind diese unteren 3. Dazu steht in M41 die x-, M42 die y- und M43 die z-Verschiebung.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 18.05.2006, 20:31    Titel: Antworten mit Zitat

Nochmals das Schema:

M11 M12 M13 M14
M21 M22 M23 M24
M31 M32 M33 M34
M41 M42 M43 M44

Meine Frage bezog sich auf die letzte Spalte und der Bedeutung der Elemente M14, M24, M34 und M44.

In der lezten Antwort stand:

M14, M24 und M34 sind immer 0 und M44 ist immer 1.

In der DirectX-Hilfe steht unter "What Is the Projection Transformation?" folgendes:

In the viewing frustum, the distance between the camera and the origin of the viewing transformation space is defined arbitrarily as D, so the projection matrix looks like:

1 0 0 0
0 1 0 0
0 0 1 1/D
0 0 0 1

Wenn ich die Dreiecke in einem Bereich von 1 bis 100 Einheiten rendern will, in welche die Kamera zeigt, dann ist D = 1. Nun ist M34 gleich 1. Ich weiß aber nicht, wie ich diesen Fall behandeln muss.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 19.05.2006, 00:01    Titel: Antworten mit Zitat

Very Happy Ich habe das Problem gelöst. Diese Frage wurde schon einmal im Forum gestellt und beantwortet (Funtion: D3DXVec3Project) .
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum