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

17.05.2004, 19:55

Problem mit Kamera-Matrix -> falsche Tansformation

Hallo liebe Spieleentwickler-Gemeinde,

ich habe ein kleines Problemchen mit meiner Kameramatrx. Es ist so, dass ich - ohne eine Kameramatrix - keine Probleme beim Darstellen von 3D Geometrie habe. Ich kann diese verschieben, drehen etc... und alles läuft wunderbar. Die Achsen "stimmen" auch, d.h. die Y - Achse zeigt nach oben (relativ vom Betrachter aus), was bei meiner Problembeschreibung gleich wichtig wird:

Setze ich nun jedoch eine Kameramatrix ein, so transformieren sich die Vertizes ins reinste Chaos ;) Verschiebe ich z.B. die Kameraposition, so -drehen- sich meine 3D Objekte. Auch wenn ich einfach nur die Kamera weiter in den Raum schieben möchte (die Z Komponente des Positionsvektors der Kamera erhöhen), dreht sich der ganze Kram ganz unkontrolliert.

Hier einmal der Code, der meine Kameramatrix erstellt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//------------------------------------------------------------------
// Erstellt eine Kameramatrix
// vLookat: Vektor, zu dem die Kamera "sieht"
// vPos:    Positionsvektor der Kamera
// vUp:     Richtungsvektor für die Y Achse der Kamera
static qCMatrix CameraMatrix(const qCVector &vPos, const qCVector &vLookAt, const qCVector &vUp)
{
    // Zunächst alle 3 Achsen der Kamera ermitteln - Richtungsverktoren

    qCVector vZAxis( qCVector::Normalize(vLookAt - vPos) );
    qCVector vXAxis( qCVector::CrossProduct(vZAxis, vUp) );
    qCVector vYAxis( qCVector::CrossProduct(vZAxis, vXAxis) );

    return qCMatrix::TranslationMatrix( -vPos ) * qCMatrix(vXAxis.GetX(), vYAxis.GetX(), vZAxis.GetX(), 0.0,
                                   vXAxis.GetY(), vYAxis.GetY(), vZAxis.GetY(), 0.0,
                                   vXAxis.GetZ(), vYAxis.GetZ(), vZAxis.GetZ(), 0.0,
                                   0.0,           0.0,           0.0,           1.0);
}


Wenn gerendert werden soll, mache ich z.Z. folgende Schritte:

Quellcode

1
2
3
4
5
6
7
qCMatrix mTranslation   = qCMatrix::TranslationMatrix(qCVector(0.0f, 0.0f, 100.0f));
qCMatrix mCamera = qCMatrix::CameraMatrix(g_vCamPos, qCVector(0.0f, 0.0f, 1.0f), qCVector(0.0f, -1.0f, 0.0f));

qCMatrix mWorld = mTranslation * mCamera;
hResult = pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&((D3DMATRIX)mWorld));

// (...hier wird gezeichnet...)


Auffällig ist noch, dass ich beim Vektor für die lokale Y Achse der Kamera statt (0, 1, 0) eben (0, -1, 0) angeben muss - ansonsten stehen alle meine 3D Objekte Kopf :) Das sollte doch eigentlich auch nicht so sein.

Wie gesagt, lasse ich das "* mCamera;" aus der Welt-Matrix aus, so funktioniert alles wunderbar, kommt die Kameramatrix mit ins Spiel, dann gibt es absolutes Chaos.


Ich hoffe sehr, dass mir hierbei jemand weiterhelfen kann. Falls ihr noch fragen zu irgendwelchem Code habt, dann poste ich ihn hier natürlich sofort.

Vielen Dank für Eure Hilfe!

-Luke

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

17.05.2004, 20:12

Also als erstes fällt mir auf, dass du volkommen von der Standard verarbeitung abweichst:

Quellcode

1
2
3
4
5
6
7
8
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
(DOKU)

Also du hast den vXAxis nicht normalisiert und du hast die funktion TranslationMatrix( -vPos ) aufgerufen. Da ich nicht den code dieser Funktion kenne würde ich pauschal mal sagen, dass du auf der sicheren Seite bist, wenn du das schonoft erprobte nutzt. ;) [/quote]

MannyDasMammut

Treue Seele

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

3

17.05.2004, 20:23

Hä,

Soweit ich weiß setzt man die Kamera doch als View Matrix und rechnet sie nicht in die Weltmatrix mit ein.

Ich würd mal:

pD3DDevice->SetTransform(D3DTS_vIEW,&deineCameraMatrix);

verwenden.

Und Projektionsmatrix sollte man auch nicht vergessen: :))))))

Hoffentlich hab ich nichts falsch verstanden
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

Anonymous

unregistriert

4

18.05.2004, 00:07

Ich glaube ich habe den "Fehler" gefunden. Es war jedoch ein Verständisfehler meinerseits - es ist klar, dass sich die Objekte drehen, wenn ich z.B. die Y Komponente der Position der Kamera verändere - denn der Punkt, zu dem die Kamera blickt, ist ja immer noch konstant. Deswegen hatte ich den Eindruck, die Objekte würden sich drehen - peinlich, peinlich :)
Um also die Kamera "strafen" zu lassen, muss ich sowohl die Kameraposition als auch den Punkt, zu dem sie Blickt, verändern.

Ich bin der Meinung, dass meine Kamera trotzdem noch nicht 100% funktioniert, da sie einige Objekte schon heftig verzerrt (schlecht zu erklären), aber ich denke ich werde es erstmal selbst versuchen, bevor ich hier wieder Frage :)

Also, trotzdem Danke für Eure Hilfe :D

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

5

18.05.2004, 09:41

Zitat


da sie einige Objekte schon heftig verzerrt


Wie Nox sagte, genau das passiert, wenn Du nicht normierst :).

Anonymous

unregistriert

6

18.05.2004, 15:15

Zitat von »"Osram"«

Zitat


da sie einige Objekte schon heftig verzerrt


Wie Nox sagte, genau das passiert, wenn Du nicht normierst :).


ausserdem ist die X-Achse das Kreuzprodukt aus Y und Z Achse und nicht andersherum !!!!!

Werbeanzeige