|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 18.05.2006, 06:01 Titel: Projection Transformation |
|
|
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 |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 18.05.2006, 07:51 Titel: |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 18.05.2006, 18:32 Titel: Re: Projection Transformation |
|
|
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 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 |
|
|
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 18.05.2006, 20:31 Titel: |
|
|
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 |
|
|
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 19.05.2006, 00:01 Titel: |
|
|
Ich habe das Problem gelöst. Diese Frage wurde schon einmal im Forum gestellt und beantwortet (Funtion: D3DXVec3Project) . |
|
Nach oben |
|
|
|
|
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
|