 |
JLI Spieleprogrammierung
|
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
|
Verfasst am: 30.04.2005, 23:03 Titel: Kamera Matrix geht net :-( |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 30.04.2005, 23:07 Titel: |
|
|
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  _________________ '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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.05.2005, 10:28 Titel: |
|
|
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 |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.05.2005, 16:09 Titel: |
|
|
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 |
|
 |
|
|
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
|