|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 21.04.2005, 10:47 Titel: Perspective-Matrix so dass ichs kapieren kann |
|
|
Sorry, dass ich so eine bescheuerte Frage stelle, aber ich habe mindestens 10^4 Tutorals abgegrast und keines gefunden in dem erklärt wird wie man eine ordentlich Perspectiv-View- und ProjektionsMatrix OHNE D3DX erstellt. Eine orthogonale nützt mir nichts.
Weiß einer was. Hab schon ewig gesucht und bin relativ genervt. Thx _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 21.04.2005, 13:32 Titel: |
|
|
steht in der DX Doku, bei den Beschreibungen der D3DX funktionen _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 21.04.2005, 13:35 Titel: |
|
|
Tja ich hab ein Tutorial wo das alles drin steht
CPP: | // ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Erstellt eine Projektionsmatrix!
// ///////////////////////////////////////////////////////////////////////////
void direct3d::createProjection (float fov, float aspect, float nearPlane, float farPlane) const
{
if (::math::abs<float>(farPlane-nearPlane) < ::math::epsilon<float>::value)
return;
if (::math::abs<float>(::math::sin<float>(::math::deg2rad<float>(fov)/2)) < ::math::epsilon<float>::value)
return;
// Zwischenwerte berechnen
const float cosin = ::math::cos<float>(::math::deg2rad<float>(fov)/2) /
::math::sin<float>(::math::deg2rad<float>(fov)/2);
const float farinv = farPlane / (farPlane - nearPlane);
// Temporäres Objekt
static ::math::matrix temp;
// Matrix verändern
temp._11 = aspect*cosin;
temp._22 = 1.0f*cosin;
temp._33 = farinv;
temp._34 = 1.0f;
temp._43 = -farinv*nearPlane;
temp._44 = 0.0f;
// Projektionsmatrix setzen
direct3d9device_->SetTransform (D3DTS_PROJECTION, &temp.getD3DMATRIX());
} |
_________________ '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 |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 21.04.2005, 15:39 Titel: |
|
|
Hmm Oops stand wirklich so in der Doku, auch das was Patrick gepostet hat, sorry
Shit, ich hab so lange nichts mit 3D-Sachen gemacht...
Was wär die beste Methode um eine Kamera zu drehen? Zwei Winkel und daraus immer neu den LookAt-Vektor berechnen und neu View aufsetzen? Oder Quaternionen?
Kann man irgendwie die Viewmatrix direkt modifizieren? _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 21.04.2005, 15:45 Titel: |
|
|
Es kommt drauf an was Du machen willst! Von Quaternions rate ich aus Prinzip her Anfängern wehement ab, da das Vorstellungsvermögen für die Mehrdimensionale Mathematik etwas höher liegt als nur "Einfache Matrizenrechnung" womit hier sowieso noch einige Probleme haben.
Am Besten beantwortest Du folgende Frage:
Was willst Du machen und wie hättest Du es gern? _________________ '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 |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 21.04.2005, 15:52 Titel: |
|
|
Hmm...
Im Moment versuch ich wieder mal eine Kamera aufzusetzen die ich bewegen kann.
Davon gibts ja zwei Sorten. Einmal mit Gimbal Lock (Hey, das war das erste was du mir erklärt hast als ich hier neu war ) und einmal ohne.
Die mit ist zum Beispiel für Egoshooter gut, die ohne für Flugsimulationen.
Für die mit GimbalLock reichen zwei Winkel oder? Daraus kann ich den LookAt-Vektor berechnen: CPP: | CustomMath::CustomVector3 vLookAt;
vLookAt.x= sin(RotY);
vLookAt.z= cos(RotY);
vLookAt.y= sin(RotX);
vLookAt.Normalize();
vLookAt=CustomMath::Vector3Add(vLookAt, vPosition);
// dann die ViewMatrix neu berechnen
|
Das geht ja noch. Aber wie geht das andere? _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 21.04.2005, 15:59 Titel: |
|
|
Für die mit GimbalLock rechnest Du ganz einfach eine EULA-Matrix aus.
Falls Dich interessiert wie man eine normale LookAt bastelt:
CPP: | // ///////////////////////////////////////////////////////////////////////////
// PUBLIC
//
// Kameramatrix berechnen
// ///////////////////////////////////////////////////////////////////////////
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));
} |
Gefunden bei mir
http://83.246.114.104/patrick/mathlib/mathlib_1.0.1.2.zip
_________________ '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 |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 21.04.2005, 16:03 Titel: |
|
|
Hmm was isn ne Eula-Matrix? Google sagt nüx...
Des andere ist ja das erstellen der Viewmatrix, das habsch schon. _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 22.04.2005, 13:58 Titel: |
|
|
Eben nicht
Sagt mir wenigstens noch ob meine Matrixmultiplikation richtig ist
CPP: | CustomMath::CustomMatrix4x4 Mat;
Mat._11 = Mat1._11*Mat2._11+Mat1._12*Mat2._21+Mat1._13*Mat2._31+Mat1._14*Mat2._41;
Mat._21 = Mat1._21*Mat2._11+Mat1._22*Mat2._21+Mat1._23*Mat2._31+Mat1._24*Mat2._41;
Mat._31 = Mat1._31*Mat2._11+Mat1._32*Mat2._21+Mat1._33*Mat2._31+Mat1._34*Mat2._41;
// .... |
Hmm? _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 22.04.2005, 14:03 Titel: |
|
|
Sieht beim Überfliegen richtig aus, falls Du Dir nicht sicher bist:
Hier ist meine:
CPP: | template<typename T> inline basic_matrix<T>& basic_matrix<T>::operator*= (const basic_matrix<T>& other)
{
basic_matrix<T> temp (*this);
// Zeile 1
_11 = temp._11*other._11 + temp._12*other._21 + temp._13*other._31 + temp._14*other._41;
_12 = temp._11*other._12 + temp._12*other._22 + temp._13*other._32 + temp._14*other._42;
_13 = temp._11*other._13 + temp._12*other._23 + temp._13*other._33 + temp._14*other._43;
_14 = temp._11*other._14 + temp._12*other._24 + temp._13*other._34 + temp._14*other._44;
// Zeile 2
_21 = temp._21*other._11 + temp._22*other._21 + temp._23*other._31 + temp._24*other._41;
_22 = temp._21*other._12 + temp._22*other._22 + temp._23*other._32 + temp._24*other._42;
_23 = temp._21*other._13 + temp._22*other._23 + temp._23*other._33 + temp._24*other._43;
_24 = temp._21*other._14 + temp._22*other._24 + temp._23*other._34 + temp._24*other._44;
// Zeile 3
_31 = temp._31*other._11 + temp._32*other._21 + temp._33*other._31 + temp._34*other._41;
_32 = temp._31*other._12 + temp._32*other._22 + temp._33*other._32 + temp._34*other._42;
_33 = temp._31*other._13 + temp._32*other._23 + temp._33*other._33 + temp._34*other._43;
_34 = temp._31*other._14 + temp._32*other._24 + temp._33*other._34 + temp._34*other._44;
// Zeile 4
_41 = temp._41*other._11 + temp._42*other._21 + temp._43*other._31 + temp._44*other._41;
_42 = temp._41*other._12 + temp._42*other._22 + temp._43*other._32 + temp._44*other._42;
_43 = temp._41*other._13 + temp._42*other._23 + temp._43*other._33 + temp._44*other._43;
_44 = temp._41*other._14 + temp._42*other._24 + temp._43*other._34 + temp._44*other._44;
return (*this);
} |
_________________ '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 |
|
|
HomeLess_PunkDrummer JLI Master Trainee
Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 22.04.2005, 14:13 Titel: |
|
|
Hmm, das dürfte es sein. So war zumindest auch mein einzelner Gedankengang (hatte heut noch nicht viele)
Thx, jetzt kann ich meinen D3DX-freien Würfel endlich rotieren. _________________ "Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 22.04.2005, 14:46 Titel: |
|
|
Du weißt ja:
Wenn 2 Matrizen multipliziert werden muss 'M' der Linken Matrix dem 'N' der Rechten Matrix entsprechen! Dann einfach die Zeilenvectoren der Linken Matrix mit den Spaltenvectoren der Rechten Multiplizieren und schwupp: Neue MxN Matrix ist da
Achja:
Für Rotationen, Translationen, Invertierungen und Transponierungen findet sich einiges in meiner oben schon genannten Mathlib Da siehste wie das dann berechnet wird in Grad und nicht in Radiat wie es die D3DX-Funktionen erwarten _________________ '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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 22.04.2005, 18:30 Titel: |
|
|
Wo kann man deine Math-Libary denn herkriegen??? Aus deiner Site? Wenn ja, schick mir die bitte ma
Gruß DirectXer |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 22.04.2005, 18:39 Titel: |
|
|
ok, thx |
|
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
|