JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Kamera Matrix geht net :-(

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.04.2005, 23:03    Titel: Kamera Matrix geht net :-( Antworten mit Zitat

Also, nach der neuste Mode D3DXfree folgend, habe ich versucht eine Kameramatrixerstellungsfunktion zu schreiben.
CPP:
__forceinline cMatrix MatrixCamera(const cVector &Dir, const cVector &Pos, const cVector &Up)
{
   cVector XAchse, YAchse, ZAchse;
   ZAchse=cVector(Dir-Pos).normalize();
   XAchse=cVector(Kreuzprodukt(Up, ZAchse)).normalize();
   YAchse=cVector(Kreuzprodukt(ZAchse, XAchse)).normalize();

   return cMatrix(   XAchse.x, YAchse.x, ZAchse.x, 0.0f,
               XAchse.y, YAchse.y, ZAchse.y, 0.0f,
               XAchse.z, YAchse.z, ZAchse.z, 1.0f,
               -Punktprodukt(XAchse, Pos), -Punktprodukt(YAchse, Pos), -Punktprodukt(ZAchse, Pos), 1);
}

in der DX Doku stand dazu ja folgendes:
Code:

D3DXMATRIX *D3DXMatrixLookAtLH(          D3DXMATRIX *pOut,
    CONST D3DXVECTOR3 *pEye,
    CONST D3DXVECTOR3 *pAt,
    CONST D3DXVECTOR3 *pUp
);
Parameters

pOut
[in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
pEye
[in] Pointer to the D3DXVECTOR3 structure that defines the eye point. This value is used in translation.
pAt
[in] Pointer to the D3DXVECTOR3 structure that defines the camera look-at target.
pUp
[in] Pointer to the D3DXVECTOR3 structure that defines the current world's up, usually [0, 1, 0].



This function uses the following formula to compute the returned matrix.

 
zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)

 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  1

Eigetnlich sollte das genau funktionieren, tut es aber net. Punktprodukt, Kreuzprodukt und normalisieren habe ich gecheckt, wenn das was Scherfgen sagt stimmt, müssten die auch richtig sein.
Hier mal wie ich die benutzen möchte:
CPP:
   cMatrix mView=MatrixCamera(cVector(CameraPosition.x, CameraPosition.y, CameraPosition.z), cVector(LookAt.x, LookAt.y, LookAt.z), cVector(0.0f, 0.0f, 1.0f));
   ViewMatrix=mView.D3DMatrix;
   //D3DXMatrixLookAtLH(&ViewMatrix, (D3DXVECTOR3*)&CameraPosition, (D3DXVECTOR3*)&LookAt, &D3DXVECTOR3(0.0f, 0.0f, 1.0f));
   m_lpD3DDevice->SetTransform(D3DTS_VIEW, &ViewMatrix);

Tja, wenn ich das Kommentar wegmache, funktionert es, was man auch erwarten sollte. Beim rendern passiert einfach folgendes, das man gra nix sieht. Achja, meine Projektionsmatrix funktioneirt, da freu ich mich auch drüber, aber jetzt möchte ich das die Sichtmatrix auch noch funktioneit.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 30.04.2005, 23:07    Titel: Antworten mit Zitat

CPP:
template<typename T> inline void basic_matrix<T>::lookAt (const basic_vector<T>& position, const basic_vector<T>& direction, const basic_vector<T>& up) const
{
        // Einheitsmatrix erstellen
    identity ();

        // Die z-Achse des Kamerakoordinatensystems berechnen
    basic_vector<T> zAxis ((direction - position).normalize());

        // Die x-Achse ist das Kreuzprodukt aus y- und z-Achse
    basic_vector<T> xAxis (up.crossProduct(zAxis).normalize());

        // y-Achse berechnen
    basic_vector<T> yAxis (zAxis.crossProduct(xAxis).normalize());

    // Rotationsmatrix erzeugen und die Translationsmatrix mir ihr multiplizieren
    static basic_matrix<T> trans;
    trans.translate (-position, true);

        // Matrizen multiplizieren und zuweisen
    (*this) = trans * matrix (xAxis.x,             yAxis.x,             zAxis.x,             static_cast<T>(0.0),
                              xAxis.y,             yAxis.y,             zAxis.y,             static_cast<T>(0.0),
                              xAxis.z,             yAxis.z,             zAxis.z,             static_cast<T>(0.0),
                              static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(1.0));
}


Miteinander vergleichen Smile
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 01.05.2005, 10:28    Titel: Antworten mit Zitat

Ok, folgende Fehelr habe ich schon behoben:
- Beim Punktprodukt werden die Vektoren falls nötig normaliert
- Ich habe die Funktion mit der falschen Parameterreinfolge aufgerufen (Dir und Pos vertauscht)
- an der Stelle 4,3 stand ne 1, wo eigentlich ne 0 hin musste
- die y-Achse normalisiere ich net, weils im SDK Beispiel auch netgemacht wird

Das Resultat ist, das ich immer noch nix sehe. Bzw. einmal kurz ein schwarzes Dreieck am rechten Rand.
ich hoffe mal, das es nur noch einen Fehler dadrin gibt.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 01.05.2005, 10:34    Titel: Antworten mit Zitat

Wie wäre es wenn Du die Y-Achse auch mal normalisierst? Vergleiche einfach mal Deinen Code mit meinem, bei mir läufts prima Very Happy
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.05.2005, 16:09    Titel: Antworten mit Zitat

hm, danke, ich habs jetzt so gemacht, wie Patrick, also net direkt in ein Schema, sondern 2 Matrizen und die dann multiplizieren. jetzt geht es. Nur komsich das in der Doku so ein Quatsch steht!? Naja, egal, haupsache es geht nu!
_________________
https://jonathank.de/games/
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 -> Entwicklung 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