 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 14.03.2005, 19:55 Titel: Kamera in OpenGL |
|
|
Hallo,
ich suche mich nun seit Tagen doof im Internet und habe immer noch keine passende Antwort gefunden.
Wie macht man in OpenGL eine Kamera die Vergleich mit einer in DirectX ist?
Würde mich freuen, wenn ich Links oder Codeschnippsel bekommen könnte.
Gruß
Cats _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 14.03.2005, 20:01 Titel: |
|
|
Fragen wir mal so: Was meinst Du mit Kamera?
- Die VIEW_MATRIX die es in OpenGL nicht gibt sondern nur in Direct3D?
- Eine LookAt-Funktion?
oder was anderes?
Kamera ist ein sehr Breites Spektrum _________________ '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 |
|
 |
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 14.03.2005, 20:21 Titel: |
|
|
Genau,
ich meine die View Matrix, die zum einen ne Kamera Position und einen LookAt Vektor besitzt.
Außerdem eine Projection Matrix die Verzerrungswinkle, View Frustrum und Clipping Plane setzt, etc. _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 14.03.2005, 20:30 Titel: |
|
|
Also die ViewMatrix ist eigentlich ganz leicht zu emulieren in OpenGL:
Es gibt 2 Funktionen für das Pushen und Poppen einer Matrix auf den Matrix-Stack!
läuft folgendermaßen ab:
CPP: | // Matrizen Nullen
glLoadIdentity ();
// LookAt ausführen für die View-Matrix
gluLookAt (blablabla);
// ViewMatrix ist die unterste Matrix im Matrix-Stack!
glPushMatrix ();
// Rendern und co
// Stack aufräumen
glPopMatrix (); |
Jetzt kann man für die LookAt die glu.lib includieren, jedoch halte ich persönlich von diesem Teil absolut nichts.
Unter OpenGL benutz ich eine kleine Eigenkreation: (ACHTUNG: läuft einwandfrei aber sehr dirty und unoptimiert, da noch von 1999 )
CPP: | // /////////////////////////////////////////////////
// PUBLIC
//
// Setzt die Kamera
//
// [in] position: Die Position der Kamera
// [in] lookat: Wohin die Kamera sieht
// [in] up: Der Up-Vector der Kamera
// /////////////////////////////////////////////////
void CMatrix::lookAt (const CVector3D &position, const CVector3D &lookat, const CVector3D &up)
{
// Kommende Optimierungen:
// -----------------------
// x,y,z ersetzen durch vega::CVector3D Objekte
// Sowie berechnungen per vega::CVector3D Objekte
//
// Das Makro entfernen (Immer diese Testsachen :D)
float x[3];
float y[3];
CVector3D z;
z = position - lookat;
float mag = z.length();
if (mag)
{
z /= mag;
}
// Y vector
y[0] = up.x;
y[1] = up.y;
y[2] = up.z;
// X vector = Y cross Z
x[0] = y[1] * z.z - y[2] * z.y ;
x[1] = -y[0] * z.z + y[2] * z.x;
x[2] = y[0] * z.y - y[1] * z.x;
// Recompute Y = Z cross X
y[0] = z.y * x[2] - z.z * x[1];
y[1] = -z.x * x[2] + z.z * x[0];
y[2] = z.x * x[1] - z.y * x[0];
mag = FastSqrtf(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
if (mag)
{
x[0] /= mag;
x[1] /= mag;
x[2] /= mag;
}
mag = FastSqrtf(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
if (mag)
{
y[0] /= mag;
y[1] /= mag;
y[2] /= mag;
}
CMatrix m;
CMatrix t;
#define M(row,col) m.matrix[col*4+row]
M(0, 0) = x[0];
M(0, 1) = x[1];
M(0, 2) = x[2];
M(0, 3) = 0.0f;
M(1, 0) = y[0];
M(1, 1) = y[1];
M(1, 2) = y[2];
M(1, 3) = 0.0f;
M(2, 0) = z.x;
M(2, 1) = z.y;
M(2, 2) = z.z;
M(2, 3) = 0.0f;
M(3, 0) = 0.0f;
M(3, 1) = 0.0f;
M(3, 2) = 0.0f;
M(3, 3) = 1.0f;
#undef M
t.translate (position);
t._41 = -t._41;
t._42 = -t._42;
t._43 = -t._43;
(*this) = (m*t);
} |
kann man dann folgendermaßen ausführen:
CPP: | vega::CMatrix mat, mat2;
mat.lookAt (vega::CVector3D(-2.5f, 0, -0.5f), vega::CVector3D(0, 0.5f, 0), vega::CVector3D(0,1,0));
glMultMatrixf(mat.matrix); |
- Patrick, der sich schämt wegen diesen altem Mist  _________________ '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 |
|
 |
Catscratch1 Junior JLI'ler
Anmeldedatum: 20.01.2005 Beiträge: 98
Medaillen: Keine
|
Verfasst am: 15.03.2005, 08:14 Titel: |
|
|
Danke für den Tipp.
Aber ich denke ich nehm die glu Variante.
Sonst muss ich meinem Dozenten noch mehr erklären *G* _________________ "Dispatcher und Scheduler sind wie Brüder, bloß anders" |
|
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
|