JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Meine DirectX Fragen...

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



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 19:06    Titel: Meine DirectX Fragen... Antworten mit Zitat

Hi,

ich lerne ja grade DirectX mit dem Buch von Christian Rousselle und ich denke ich eröffne mal einen thread in dem ich all meine Fragen zu DirectX stelle, weil ich glaube, dass das ziemlich viele werden (DirectX ist ja kein Kinderspiel^^ und schon gar nicht wenn man es komplett alleine lernt ohne Ausbildung und so ^^).

Hier sind schon mal ein paar Fragen:

D3DXMATRIX:
Die D3DXMATRIX wird ja in verschiedenen Bereichen verwendet^^
D3DXMATRIX wird für die Kameraposition, für den Sichtkegel der Kamera und für das Verschieben und Skalieren von 3D Objekten verwendet.
Also ist D3DXMATRIX eine Universal-Struktur für das verschieben und skalieren von irgendwelchen Direct3D Objekten zuständig, oder?
Sehe ich das richtig so ??
Und kann man mit D3DXMATRIX auch die Position einer Lichtquelle verändern??

D3DXMatrixMultiply
D3DXMatrixMultiply kann doch 2 Matrizen (also zwei Bewegungen) in eine D3DXMATRIX-Struktur packen. darf man dann auch noch diese gepackte D3DXMATRIX-Struktur mit einer weiteren D3DXMATRIX-Struktur zusammenpacken??

Und im buch wird eine Funktion MoveCamera gezeigt:
CPP:
void CScene::MoveCamera(int Dir)
{
    int Framerate = m_ResManager->GetFramerate();

    if(MOVE_UP & Dir)
    {
        D3DXMatrixTranslation(&m_TransMatrix, 0.0f, 0.0f, -m_StepZ / Framerate);
    }
    else if(MOVE_DOWN & Dir)
    {
        D3DXMatrixTranslation(&m_TransMatrix, 0.0f, 0.0f, m_StepZ / Framerate);
    }

    if(MOVE_LEFT & Dir)
    {
        D3DXMatrixTranslation(&m_TransMatrix, m_StepX / Framerate, 0.0f, 0.0f);
    }
    else if(MOVE_RIGHT & Dir)
    {
        D3DXMatrixTranslation(&m_TransMatrix, -m_StepX / Framerate, 0.0f, 0.0f);
    }

    // Wenn keine Taste gedrueckt wurde
    // Identitaet zuweisen
    if(0 == Dir)
    {
        D3DXMatrixIdentity(&m_TransMatrix);
    }

    // Zum Schluss muessen ViewMatrix und TransMatrix
    // multipliziert werden
    D3DXMatrixMultiply(&m_ViewMatrix, &m_ViewMatrix, &m_TransMatrix);

    // neue Kameraposition festlegen
    m_lpD3DDevice->SetTransform(D3DTS_VIEW, &m_ViewMatrix);
}


Hier wird (so wie ich das sehe) eine gefüllte D3DXMATRIX-Struktur (m_TransMatrix) mit einer leeren D3DXMATRIX-Struktur (m_ViewMatrix) multipliziert^^
Ist das überhaupt sinnvoll??
man kann doch gleich m_TransMatrix verwenden, oder ??

//Edit: Ich habe mich geirrt ^^ m_ViewMatrix ist nicht leer, sie wird auch bei der initialisierung der kamera-position verwendet. Allerdings verstehe ich immer noch nicht wozu das gut sein soll ^^
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 19:26    Titel: Antworten mit Zitat

Die View-Matrix stellt die Position und Richtung der "Kamera" dar. Stell dir das vor wie ein Koordinatensystem in dem Welt-Koordinatensystem..

Durch die Multiplikation werden die Objektepositionen so verschoben/skaliert/... als würde man sie durch die Kamera sehen.

Relevante Links:
http://de.wikipedia.org/wiki/Matrix_%28Mathematik%29
http://msdn2.microsoft.com/en-us/library/bb197901.aspx
http://www.programmersheaven.com/2/world-view
http://www.senocular.com/flash/tutorials/transformmatrix/
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 19:31    Titel: Antworten mit Zitat

Hehe. Matrizen haben überhaupt kein bisschen was mit DirectX zu tun. Das ist pure Mathematik.
Du solltest dich ein wenig mit den Grundlagen vertraut machen, ich kenne nur leider zur Zeit kein schönes Tutorial für Matrizen.

Grob gesagt, eine Matrix verändert einen Vektor. Es gibt eine ganze Reihe von Möglichkeiten, in 3D sind halt ein paar wichtig, wie Rotation, Skalation, Translation (drehen, Größe ändern, verschieben auf Deutsch) sowie Projektion (hm, schwer zu erklären).

Man kann 2 Matrizen multiplizieren, und erhält wieder eine Matrix. Diese auf einen Vektor angewand hat den selben Effekt, als hätte man die ursprünglichen Matrizen nacheinander auf den Vektor angewandt.

Alles funktioniert im Prinzip nur mit Matrizen. Du hast einen Würfel, davon hast du die Eckpunkte (x/y/z). Du nimmst mehrere Matrizen, multiplizierst diese und hast am Ende eine Matrix, die du mit jedem Punkt des Würfels multiplizierst um die Position am Bildschirm jedes Eckpunktes zu bestimmen. Dabei interessieren erstmal nur x und y Koordinate, da der Bildschirm flach ist, also wird der z Wert erstmal ignoriert (der wird später aber wieder sehr wichtig).

Matrizen sind also unglaublich mächtig, man muss prinzipiell nicht genau wissen, wie sie funktionieren, solange man weiß das man durch geschickte Kombination einzelner Matrizen beinahe alles erreichen kann.

Also: Ja, prinzipiell kann man alles mit Matrizen machen. Und sogar Dinge, die du dir jetzt noch gar nicht vorstellen kannst Very Happy
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 21:18    Titel: Antworten mit Zitat

Nagut ^^ dann habe ich hier schonma die nächste frage:

http://www.imagespell.com/show.php?id=15607152c1c06c088b2f71a727424a5e.png

Also ich soll die neuen punkte berechnen, wenn ich zum beispiel nicht in die z/x richtung gehen will, sondern irgendwo dazwischen.

Im Buch steht, dass das mithilfe dieser rechnungen geht:
CPP:
    m_vPosition.x = sinf(m_fRotAngleY) + m_vPosition.x;
    m_vPosition.z = cosf(m_fRotAngleY) + m_vPosition.z;


Aber irgendwie verstehe ich das nicht^^

Guck ma, wenn ich jetzt sinus 30° berechne erhalte ich ja die Länge der Gegenkathete ^^
Und die Länge der Gegenkathete entspricht (meiner Meinung nach) die Höhe auf der Z-Achse. Also in diesem Fall 0,5 .

Aber warum wird in dieser Funktion da oben x (!?) 0,5 zugewiesen und nicht z???
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



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

BeitragVerfasst am: 21.03.2008, 21:27    Titel: Antworten mit Zitat

das ist immer eine frage, wie du den Winkel m_fRotAngleY definierst. Du musst dabei z.B. die Richtung, den Startpunkt vorher festlegen. Je nachdem wie du dies tust, vertauschen sich manchmal sin und cos bzw. + und -. Auf deinem Bild z.B. ist es ein Unterschied, ob die y-Achse nun zu dir oder von dir weg zeigt. Die Rotationsrichtung dreht sich dabei um.

Ein kleines Beispiel dazu: Du rotierst auf dem bild von deiner richtung aus gegen den Uhrzeigersinn. Zeigt die y-Achse hier nun auf dich, würde es sich um ein rechtshändiges Koordinatensystem handeln, wie in OpenGL gerechnet wird. Ziegt sie dagegen von dir weg, handelt es sich um ein lh. System, wie es in DirectX benutzt wird. Da gibt es dann auch Unterschiede in der Rechnung.

Dein Beispiel mit m_vPosition bezieht sich also auf DX, das Bild aber auf OpenGL. Daher der kleine Unterschied.

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



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 22:07    Titel: Antworten mit Zitat

oO ich versuche es... aba ich kanns mir nicht bildlich vorstellen ^^
Also bei einem rechtsseitigen Koordinatensystem ist Z weiter hinten größer als vorne...

Und wenn ich da jetzt vom Nullpunkt aus in die x richtung gucke und mich dann um 30° gegen den Uhrzeigersinn drehe gucke ich ja weiter in die z Richtung und rein mathematisch gesehen habe ich mich dann auch um +30° gedreht ^^

Und das passt doch alles zum rechtsseitigen Koordinatensystem ???
Und zu meiner Zeichnung passt es doch auch ??

Sry ^^ ich verstehe das noch nicht so richtig ^^

//edit: Und noch ne Frage habe ich ^^
Wenn sich die kamera einmal um die eigene Achse dreht, dann steht in der variable m_fRotAngleY nicht 360 sondern 2 x pi , also 6,28318.... ^^ habe ich recht??

//edit2: Und noch ne Frage:
http://nopaste.com/p/af51nTetT
Dieser Funktion wird immer nur EIN key übergeben^^ Aber warum kann ich dann im Spiel gehen und mich dann auch noch gleichzeitig drehen ???
Und warum hat er hier &-Operatoren verwendet und nicht einfach Vergleiche == gemacht ??

//edit3: Und noch ne frage xD
http://nopaste.com/p/alKAjDZe5
Warum macht er das hier so kompliziert mit
CPP:
BYTE* VertexBufferStart;
und
reinterpret_cast<void**>(&VertexBufferStart)

warum macht er das nicht einfach so: http://nopaste.com/p/a0oEBhHQ3 ???
Und was bedeutet void** ?? Mit zwei Sternchen ??
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



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

BeitragVerfasst am: 22.03.2008, 02:33    Titel: Antworten mit Zitat

RebornX hat Folgendes geschrieben:
oO ich versuche es... aba ich kanns mir nicht bildlich vorstellen ^^
Also bei einem rechtsseitigen Koordinatensystem ist Z weiter hinten größer als vorne...
Nein bei Z ist es hinten negativ und vorne positiv. Das galt für Y. Also:
DX: l.h. System: Z zeigt in den Bildschirm
OGL: r.h. System: Z zeigt auf dich.
Wenn du das vertauschst stimmt der Rest deiner Überlegung.

RebornX hat Folgendes geschrieben:
//edit: Und noch ne Frage habe ich ^^
Wenn sich die kamera einmal um die eigene Achse dreht, dann steht in der variable m_fRotAngleY nicht 360 sondern 2 x pi , also 6,28318.... ^^ habe ich recht??
Ja genau, weil in der Mathematik hier das Bogenmaß und nicht das Gradmaß benutzt wird. Ist in dem Bereich viel Vorteilhafter. 180° -> pi und 360° -> 2pi

RebornX hat Folgendes geschrieben:
//edit2: Und noch ne Frage:
http://nopaste.com/p/af51nTetT
Dieser Funktion wird immer nur EIN key übergeben^^ Aber warum kann ich dann im Spiel gehen und mich dann auch noch gleichzeitig drehen ???
Und warum hat er hier &-Operatoren verwendet und nicht einfach Vergleiche == gemacht ??
Das mit dem & ist genau der Kniff. Ich versuchs mal, ganz grob zu erklären. Schau dir aber Bitoperationen und Flags im Net oder so nochmal genauer an.
Jede Zahl (auch ein int) ist aus mehren bits zusammengesetzt (hier meist 32). Davon kann jedes entweder 1 oder 0 sein. Wieso soll man jetzt 32 bits für eine Abfrage/Möglichkeit verschwenden? Es bietet sich an, für jede Möglichkeit nur genau 1 Bit zu nehmen. Und das ist im Grunde was da gemacht wird. Les dich da aber wie gesagt nochmal genauer durch. (Steht auch im Buch, was & und | und so machen und wie die bits gehen)

RebornX hat Folgendes geschrieben:
//edit3: Und noch ne frage xD
http://nopaste.com/p/alKAjDZe5
Warum macht er das hier so kompliziert mit
CPP:
BYTE* VertexBufferStart;
und
reinterpret_cast<void**>(&VertexBufferStart)

warum macht er das nicht einfach so: http://nopaste.com/p/a0oEBhHQ3 ???
Und was bedeutet void** ?? Mit zwei Sternchen ??
Du hast es doch in deinem Beispiel genau so gemacht Razz . void mit zwei ** heißt pointer auf pointer. Was ein Pointer ist weißt du? Dann schau dir das an:
CPP:
char c = 'k';
char* p1 = &c;
char** p2 = &p; // also zeigt p1 direkt auf c, und p2 erst über einen 2. pointer auf c:
*p1 = 's'; // c ist nun nicht mehr k sondern s
**p2 = 'k'; // c ist jetzt aber wieder k
void bedeutet nur, dass der Typ nicht genau festgelegt ist (wie das hier char z.B. ist). Das ganze wird gemacht, damit die Funktion nicht nur auf den wert zugriff hat, sondern den pointer selbst auch manipulieren kann. Sowas ist manchmal wichtig Razz

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



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 22.03.2008, 03:26    Titel: Antworten mit Zitat

DirectXer hat Folgendes geschrieben:
Nein bei Z ist es hinten negativ und vorne positiv. Das galt für Y. Also:
DX: l.h. System: Z zeigt in den Bildschirm
OGL: r.h. System: Z zeigt auf dich.
Wenn du das vertauschst stimmt der Rest deiner Überlegung.


ja ich meinte eigentlich auch lh. System aba ich habs ausversehen verwechselt^^
Doch ich verstehe es trodstem nicht ^^
Guck ma ich habe meine Vorstellung so wie das funktionieren soll nochmal anders grafisch verdeutlicht:
http://www.imagespell.com/show.php?id=33db89792364d99429dc4dcfa5bf6080.png
und das da issn lh. System ^^ das habe ich vom buch ^^


DirectXer hat Folgendes geschrieben:

Das mit dem & ist genau der Kniff. Ich versuchs mal, ganz grob zu erklären. Schau dir aber Bitoperationen und Flags im Net oder so nochmal genauer an.
Jede Zahl (auch ein int) ist aus mehren bits zusammengesetzt (hier meist 32). Davon kann jedes entweder 1 oder 0 sein. Wieso soll man jetzt 32 bits für eine Abfrage/Möglichkeit verschwenden? Es bietet sich an, für jede Möglichkeit nur genau 1 Bit zu nehmen. Und das ist im Grunde was da gemacht wird. Les dich da aber wie gesagt nochmal genauer durch. (Steht auch im Buch, was & und | und so machen und wie die bits gehen)

AAAHH Jetzt hats Klick gemacht ^^ !!
aber wie (!?) kommt man auf sowas???
Das jeder Bit da beim vergleichen passt ??
Das muss doch richtig zeitaufwändig sein ??
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



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

BeitragVerfasst am: 22.03.2008, 12:51    Titel: Antworten mit Zitat

Zu dem Koordinatensystem, da gibt es eine ganz einfache Hilfe:
lh. system: nimm deine linke Hand und bilde damit ein Koordinatensystem (Daumen = x-Achse, Zeigefinger = y-Achse und Mittelfinger = z-Achse). Das heißt übr. auch genau deshalb linkshändiges Koordinatensystem. Rotationen mit einem positiven Winkel gehen immer im Uhrzeigersinn, wenn du auf die Achse draufschaust (also die Achse zeigt auf dich).
Bsp: Willst du einen Pfeil der in Richtung der x-Achse zeigt (nimm einfach [2,0,0]) um +90° um die y-Achse drehen, dann drehe deine Hand so, dass du von oben auf die y-Achse schaust (dein Zeigefinger zeigt auf dich). Dann drehst du im Uhrzeigerseinn etwas um diese Achse. Dein Vektor [2,0,0] würde nach der Rotation in Richtung der negativen z-Achse zeigen: [0,0,-2].
Das ganze klappt natürlich auch für ein rechtshändiges system, wenn du die rechte hand nutzt. Du baust damit wiedre so ein Gebilde auf, nur drehst die Hand jetzt so, dass dein Mittelfinger auf dicht zeigt. Der Unterschied zwischen lh und rh ist also nur die Richtung der z-Achse. Positive Winkel drehen immer im, negative gegen den Uhrzeigersinn.

RebornX hat Folgendes geschrieben:
AAAHH Jetzt hats Klick gemacht ^^ !!
aber wie (!?) kommt man auf sowas???
Das jeder Bit da beim vergleichen passt ??
Das muss doch richtig zeitaufwändig sein ??

Nein eben nicht. Da im PC alles in Bits vorliegt und nicht iwie als Dezimalzahl gespeichert wird, kann man auch seeeehhhr schnell auf einzelne bits zugreifen. Bitoperationen sind mitunter das Schnellste was man machen kann. Noch ein stark vereinfachtes Beispiel zu den Flags:
CPP:
const int bit1 = 1; // in binär: 0001
const int bit2 = 2; // in binär: 0010
const int bit3 = 4; // in binär: 0100
const int bit4 = 8; // in binär: 1000

// so kannst du in einer Zahl eines dieser bits setzen
int val = bit1 | bit4; // das heißt übersetzt 0001 | 1000 = 1001

// jetzt kommt noch bit2 dazu
val |= bit2; // 1001 | 0010 = 1011

// so prüfst du nun, ob ein bit gesetzt ist
if( val & bit1 )
     // bit1 ist gesetzt.
if( val & bit2 )
     // bit2 ist gesetzt.
// usw.

So, das müsste das wesentliche sein. Schau dir aber trotzdem nochmal alle anderen Bitoperationen an, auf sowas trifft man rechthäufig in der Spieleprogrammierung, da das eben so schnell ist.

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



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 22.03.2008, 16:32    Titel: Antworten mit Zitat

Oh man ich weiß nicht warum eh... Aba bei mir wird die gegenkathete immernoch mit sinus berechnet auch wenn ich im Minusbereich bin ^^
Guck ma: http://www.imagespell.com/show.php?id=9b13a2f86d0a3adef2d55aa5d17060ff.png
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 22.03.2008, 16:54    Titel: Antworten mit Zitat

RebornX hat Folgendes geschrieben:
Oh man ich weiß nicht warum eh... Aba bei mir wird die gegenkathete immernoch mit sinus berechnet auch wenn ich im Minusbereich bin ^^
Guck ma: http://www.imagespell.com/show.php?id=9b13a2f86d0a3adef2d55aa5d17060ff.png


Und warum genau möchtest du das nicht?

Versteh mich nicht falsch, aber ich habe das Gefühl, du verstehst nicht so ganz 100%ig was genau du da machst. :-)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 15:11    Titel: Antworten mit Zitat

Nagut dann nehme ich das jetzt einfach mal so, obwohl ich es nicht verstehe ^^...

Dann habe ich mal eine andere Frage:

Matrizen
Inzwischen habe ich mitgekriegt das Matrizen eigentlich gar nix mit DirectX zu tun haben, sondern pure mathematik ist.
Matrizen sind im Prinzip Tabellen die mehrere Gleichnungen enthalten und angeblich auch übersichtlicher sein sollen als normale gleichnungen.
Diese kann man mit bestimmten Rechenverfahren mit anderen Matrizen kombinieren und so erhällt man dann neue Matrizen, die dann das gewünschte Ergebnis erzielen (zB. einen Würfel einen Schritt nach vorn versetzten).
Habe ich das soweit richtig verstanden?
Muss ich diese ganzen Rechenverfahren kennen?

Einer im IRC hat gesagt das ich wissen muss was ne Rotationsmatrix ist, als ich ihm diese Frage mit dem Sinus und der gegenkathete da gestellt habe^^
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 16:10    Titel: Antworten mit Zitat

Die Matrix an sich muss nichts mit Rechenoperationen zu tun haben. An sich ist sie mal nur eine Art Datentabelle. Eine Rechenoperation kann sich daraus ergeben, je nachdem wie die Datensätze interpretiert werden bzw. wenn du eine Matrix (teilweise) mit Variablen füllst. Die "Anwendung" dieser Matrix durch Einsetzen der gegebenen Variablen aus deiner ursprünglichen Matrix ergibt dann das Ergebnis der Rechenoperation(en).
Im Prinzip rechnest du mit diesen Tabellen von Daten nicht viel anders herum wie mit einzelnen Daten seit der 5. Klasse. Nur eben etwas komplexer.

Den einzelnen Datensätzen innerhalb der Tabellen wird nun ein bestimmter Sinn gegeben. Nur so weiß dein Programm bzw. in dem Fall DirectX am Schluss, was es mit deinen Matrizen bzw. deren einzelnen Datensätzen anfangen soll. Und innerhalb von diesem "Sinnzusammenhang" verlaufen auch die Rechenoperationen, die innerhalb dieses Zusammenhangs Translation, Rotation, Skalierung ergeben.
Die Dinger sind in sofern übersichtlicher als dass sie entweder eine Rechenoperation selbst darstellen(Beispiel: Rotationsmatrix) oder einen festen Datensatz völlig getrennt von einer Rechenoperation(Beispiel: die Ergebnisse der ganzen Transformationen, deine Worldmatrix).

Du musst denke ich nicht unbedingt wissen, wie ne Rotationsmatrix aussieht (das kannst du btw glaube ich auch in der DirectX-Hilfe nachschlagen), aber du musst wissen, was sie tut, wenn du mit ihr hantierst.


Aber am besten mal das Beispiel der Translationsmatrix:
Code:
1   0   0   0
0   1   0   0
0   0   1   0
X   Y   Z   1

Zum Teil Variablen drin, zum Teil fest ausgefüllt. Die Rechenoperation, wenn man es denn so bezeichnen will, besteht in dem Fall darin, die Translationskoordinaten xyz einzufüllen und fertig ist die Matrix. Durch Multiplikation mit anderen Matrizen wie z.B. der Rotations- und Skalierungsmatrix können alle Datensätze in einer einzelnen Matrix gespeichert werden, die für eine eindeutige Transformation im Raum steht.

Andere werden dir das sicher mathematisch korrekter erklären können, aber ich hoffe, du hast so schon mal mehr verstanden.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RebornX
JLI'ler



Anmeldedatum: 16.03.2007
Beiträge: 169

Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 21:21    Titel: Antworten mit Zitat

ok alles klar ^^

So jetzt muss ich wieder zu dem Problem mit dem Koordinatensystem kommen.

Das ist ja ein Linkshändiges koordinatensystem: http://www.f-lohmueller.de/pov_tut/basic/pov_axes.jpg

Soo, also habe ich mal mit der D3DXMatrixLookAtLH() funktion ein bisschen rumgespielt und festgestellt das x und y genau hier anders rum ist:

Von oben auf die Szene gucken:
CPP:
    D3DXMatrixLookAtLH(&ViewMatrix,
                       &D3DXVECTOR3(0.0f, 9.0f, -10.0f),
                       &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
                       &D3DXVECTOR3(0.0f, 1.0f, 0.0f));


Von rechts auf die Szene gucken:
CPP:
    D3DXMatrixLookAtLH(&ViewMatrix,
                       &D3DXVECTOR3(9.0f, 0.0f, -10.0f),
                       &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
                       &D3DXVECTOR3(0.0f, 1.0f, 0.0f));


Dh. das die D3DXMatrixLookAtLH() Funktion den zweiten parameter so liest:
CPP:
&D3DXVECTOR3(y, x, z),

Und nicht so:
CPP:
&D3DXVECTOR3(x, y, z),


Bei Funktionen wie D3DXMatrixRotationY() oder D3DXMatrixRotationX() wird aber um die richtige achse gedreht^^.

Was hat sich Microsoft nur dabei gedacht ?
_________________
Besucht meine Seite:
www.cpparchiv.dl.am
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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