Hallo!
Ich versuche mir derzeit eine Kamera-Klasse zu schreiben und stehe jetzt vor einem Problem: Ich will in der Lage sein, die Kamera relativ, d.h. um ihre eigene Achse rotieren zu lassen. Ich glaube das ist eine ganz gängige Hürde für Einsteiger, auch ich bin da leider keine Ausnahme.
Eine mögliche Lösung, die ich mir ausgedacht habe, wäre folgende:
1.) Ich verschiebe das Objekt zurück auf den Ursprung des Weltkoordinatensystems
2.) Ich wende die Rotationsmatrix (für das Weltkoordinantensystem) an.
3.) Ich verschiebe das Objekt an seine ursprüngliche Position zurück
In der Theorie klappt das bei mir. Bei meiner Google-Recherche bin ich jetzt aber auf was noch viel tolleres gestoßen, was mich derzeit noch davon abhält, meine Idee umzusetzen, weil ich erstmal wissen will, was da passiert:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// Rotieren des Objekts, um seine eigenen Achsen
void tbObject::RotateRel(const tbVector3& vRotation)
{
// Rotation um die x-Achse des Objekts
tbMatrix mRotation(tbMatrixRotationAxis(m_vXAxis, vRotation.x));
m_vYAxis = tbVector3TransformNormal(m_vYAxis, mRotation);
m_vZAxis = tbVector3Cross(m_vXAxis, m_vYAxis);
// Rotation um die y-Achse des Objekts
mRotation = tbMatrixRotationAxis(m_vYAxis, vRotation.y);
m_vXAxis = tbVector3TransformNormal(m_vXAxis, mRotation);
m_vZAxis = tbVector3Cross(m_vXAxis, m_vYAxis);
// Rotation um die z-Achse des Objekts
mRotation = tbMatrixRotationAxis(m_vZAxis, vRotation.z);
m_vXAxis = tbVector3TransformNormal(m_vXAxis, mRotation);
m_vYAxis = tbVector3TransformNormal(m_vYAxis, mRotation);
// Matrizen aktualisieren
Update();
}
|
Ein Codeausschnitt aus der Tribase-Engine, hier im Forum gefunden. Ich würde gerne dahinter kommen, wie das funktioniert. Das Objekt speichert wohl drei Vektoren, die sein Koordinatensystem beschreiben (bzw. wie es in der Weltmatrix liegt). Im Endeffekt dreimal der selbe Code, soweit auch verständlich. Es wird eine mysteriöse Achsenrotationsmatrix erzeugt und auf den Vektor angewandt. Danach wird die zweite von der Transformation beeinflusste Achse über das Kreuzprodukt "wiederhergestellt". Wo es bei mir jetzt aber aufhört, ist eben diese Matrix zur Rotation um eine Achse, hier die betreffende Codepassage:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// Rotationsmatrix für Rotation um eine beliebige Achse berechnen
TRIBASE_API tbMatrix tbMatrixRotationAxis(const tbVector3& v,
const float f)
{
// Sinus und Kosinus berechnen
const float fSin = sinf(-f);
const float fCos = cosf(-f);
const float fOneMinusCos = 1.0f - fCos;
// Achsenvektor normalisieren
const tbVector3 vAxis(tbVector3Normalize(v));
// Matrix erstellen
return tbMatrix((vAxis.x * vAxis.x) * fOneMinusCos + fCos,
(vAxis.x * vAxis.y) * fOneMinusCos - (vAxis.z * fSin),
(vAxis.x * vAxis.z) * fOneMinusCos + (vAxis.y * fSin),
0.0f,
(vAxis.y * vAxis.x) * fOneMinusCos + (vAxis.z * fSin),
(vAxis.y * vAxis.y) * fOneMinusCos + fCos,
(vAxis.y * vAxis.z) * fOneMinusCos - (vAxis.x * fSin),
0.0f,
(vAxis.z * vAxis.x) * fOneMinusCos - (vAxis.y * fSin),
(vAxis.z * vAxis.y) * fOneMinusCos + (vAxis.x * fSin),
(vAxis.z * vAxis.z) * fOneMinusCos + fCos,
0.0f,
0.0f,
0.0f,
0.0f,
1.0f);
}
|
Ich denke ohne Hilfe komme ich da nicht dahinter. Das ganze ist mir ein ziemliches Rätsel und ich bräuchte die Mathematik dahinter ein wenig besser aufgeschlüsselt.
Wäre für Hilfe sehr dankbar!