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

Anonymous

unregistriert

1

06.02.2004, 17:51

Frage zur Projektionsmatrix, Kapitel 2.2.4.6

Hallo,

ich habe ein Problem mit der Erstellung einer Projektsionsmatrix. Ich bin dem "Rat" der TriBase Engine befolgt, und wollte analog eine Methode schreiben, die mir eine Projektionsmatrix berechnet und zurückgibt. Jene sieht folgendermaßen aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static CMatrix PojectionMatrix(const float fFOV, const float fAspect, const float fNearPlane, const float fFarPlane)
    {
        CMatrix mResult;

        // D3DX-Funktion benutzen
        D3DXMatrixPerspectiveFovLH((D3DXMATRIX*)(&mResult),
            fFOV,
            fAspect,
            fNearPlane,
            fFarPlane);

        

        return mResult;
    }


Hier ist sicher wichtig, dass der Casting Operator für Matrizen (eigene Matrix / D3D Matrix) implementiert wurde, was ich so gemacht habe (weiter oben in derselben Datei):

Quellcode

1
inline operator D3DMATRIX&() { return mD3DMatrix; }


Also genau wie auch in der TriBase Engine. Des weiteren sehen die Elemente meiner Matrix Klasse so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  private:
    union
    {
        struct
        {
            double m11, m12, m13, m14,
                   m21, m22, m23, m24,
                   m31, m32, m33, m34,
                   m41, m42, m43, m44;
        };


        double m[4][4];
        double n[16];
        D3DMATRIX mD3DMatrix;
    };


Nun zum eigentlichen Problem, möchte ich eine Proj. Matrix erstellen, so ergibt folgender Code im Hauptprogramm:

Quellcode

1
CMatrix m = CMatrix::ProjectionMatrix( M_PI_2, 3.0 / 4.0, 10, 100 );


Diese Matrix hier:

Quellcode

1
2
3
4
5
6
Projektionsmatrix:
0.00, 0.00, 0.01, 0.00
0.00, 0.01, 0.00, 0.00
0.00, 0.00, 1.00, 0.00
0.00, 0.00, 0.00, 1.00
Press any key to continue


Das kann doch nicht sein, oder? Vor allem ist es so, dass gravierende Änderungen an den Parametern beim Aufruf von ProjectionMatrix kaum eine Veränderung an der (Projektions-)Matrix zeigen.

Wo könnte der Fehler liegen? Der Compiler oder Linker gibt mir darüber keinen Aufschluss. Könnte es vielleicht an einem Fehlerhaften Casten der D3DMATRIX zu meiner eigenen Matrixklasse sein?


Für Hilfe wäre ich sehr dankbar


Mit freundlichen Grüssen,
Timo

Anonymous

unregistriert

2

13.02.2004, 17:54

Hallo,

kann mir denn keiner sagen, wie die Ausgabe einer solchen Projektionsmatrix aussehen soll? Oder sieht die meine korrekt aus?

Ich habt doch sicher schonmal eine Projektionsmatrix angelegt, ich würde mich freuen wenn ihr kurz hier postet, was für Werte in einer solche stehen könnten, sodass ich sie mit meiner abgleichen kann.

Möglicherweise sieht ja sogar jemand einen Fehler in meinem Code oben?


Vielen Dank!


MfG, Timo

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

13.02.2004, 20:42

Das Problem ist, dass Deine Klasse double verwendet, Direct3D aber normalerweise float. Darum kommt dann nur Müll raus. Der Casting-Operator bringt Dir da nichts, der wird in dieser Form nicht einmal aufgerufen, da Du ja das Casting so machst:

((D3DXMATRIX*)(&mResult)

Du müsstest es - wenn schon - so machen:

- einen Casting-Operator von CMatrix nach D3DXMATRIX*
- dann einfach mResult als Parameter angeben, ohne irgendwelche Klammern

Das heißt nun nicht, dass Du Deine Klasse auf float umstellen musst. Du kannst ja die Projektionsmatrix in eine normale D3DXMATRIX-Klasse erstellen und die dann Element für Element von float nach double "umwandeln".

Aber die union ist in jedem Fall falsch!

Werbeanzeige