Ich versuche, ein Kamera-Modell in Delphi/OpenGL nach der Beschreibung in OpenGL SuperBible zu implementieren. Die Kamera hat eine Position, einen Vorwärtsvektor und einen Aufwärtsvektor. Das Übersetzen der Kamera scheint OK zu sein, aber wenn ich versuche, die Kamera entsprechend dem Vorwärtsvektor zu drehen, verliere ich mein Objekt.OpenGL: Hilfe bei der Kamera-Umwandlung
function TCamera.GetCameraOrientation: TMatrix4f;
var
x, z: T3DVector;
begin
z := T3DVector.Create(-FForward.X, -FForward.y, -FForward.z);
x := T3DVector.Cross(z, FUp);
result[0, 0] := x.X;
result[1, 0] := x.Y;
result[2, 0] := x.Z;
result[3, 0] := 0;
result[0, 1] := FUp.X;
result[1, 1] := FUp.Y;
result[2, 1] := FUp.Z;
result[3, 1] := 0;
result[0, 2] := z.x;
result[1, 2] := z.y;
result[2, 2] := z.z;
result[3, 2] := 0;
result[0, 3] := 0;
result[1, 3] := 0;
result[2, 3] := 0;
result[3, 3] := 1;
end;
procedure TCamera.ApplyTransformation;
var
cameraOrient: TMatrix4f;
a, b, c: TMatrix4f;
begin
cameraOrient := getcameraOrientation;
glMultMatrixf(@cameraOrient);
glTranslatef(-FPosition.x, -FPosition.y, -FPosition.z);
end;
die Position Given (0, 0, -15) Vorwärts-Vektor (0 0 1) und bis-Vektor (0 1 0), I erwartet, dass eine Identitätsmatrix von dem getCameraOrientation-Verfahren zu erhalten, aber stattdessen bekomme ich
(1, 0, 0, 0)
(0, 1, 0, 0)
(0, 0, -1, 0)
(0, 0, 0, 1)
Wenn ich den Vorwärtsvektor (0 0 -1) ändern erhalte ich die folgende Matrix:
(-1, 0, 0, 0)
(0, 1, 0, 0)
(0, 0, 1, 0)
(0, 0, 0, 1)
nach dem Aufruf von glMultMatrix() und glTranslate(), glGet () gibt mir folgende GL_MODELVIEW_MATRIX:
(1, 0, 0, 0)
(0, 1, 0, 0)
(0, 0, -1, 0)
(0, 0, 15, 1)
ich hätte die 15 erwartet in Spalte 4 zu sein, Zeile 3, nicht Spalte 3, Zeile 4
Kann jemand sehen, wo ich diese falsch gemacht?
EDIT: Der ursprüngliche Code von OpenGL SuperBible:
inline void GetCameraOrientation(M3DMatrix44f m)
{
M3DVector3f x, z;
// Make rotation matrix
// Z vector is reversed
z[0] = -vForward[0];
z[1] = -vForward[1];
z[2] = -vForward[2];
// X vector = Y cross Z
m3dCrossProduct(x, vUp, z);
// Matrix has no translation information and is
// transposed.... (rows instead of columns)
#define M(row,col) m[col*4+row]
M(0, 0) = x[0];
M(0, 1) = x[1];
M(0, 2) = x[2];
M(0, 3) = 0.0;
M(1, 0) = vUp[0];
M(1, 1) = vUp[1];
M(1, 2) = vUp[2];
M(1, 3) = 0.0;
M(2, 0) = z[0];
M(2, 1) = z[1];
M(2, 2) = z[2];
M(2, 3) = 0.0;
M(3, 0) = 0.0;
M(3, 1) = 0.0;
M(3, 2) = 0.0;
M(3, 3) = 1.0;
#undef M
}
inline void ApplyCameraTransform(bool bRotOnly = false)
{
M3DMatrix44f m;
GetCameraOrientation(m);
// Camera Transform
glMultMatrixf(m);
// If Rotation only, then do not do the translation
if(!bRotOnly)
glTranslatef(-vOrigin[0], -vOrigin[1], -vOrigin[2]);
}
Er sollte in der Lage sein, sich um den Vorwärtsvektor zu drehen, ohne sein Objekt aus den Augen zu verlieren. – Nosredna
Ich rotiere nicht um den Vorwärtsvektor, ich rotiere entsprechend dem Vorwärtsvektor. In meinem Fall, wo oben ist gerade auf der y-Achse, wird dies die gleiche sein wie eine Drehung um die y-Achse. Da vorwärts gerade entlang der z-Achse verläuft, sollte es überhaupt keine Drehung geben. Aber da ist, so verliere ich die Spur meines Objekts .... – Vegar
Nun die Matrix in Ihrem ersten Fall kehrt die Z-Achse zurück. Wenn Sie auf die positive Z-Achse "schauen", wird das Zurückkehren nur "zurückschauen". Warum wird z aus dem negativen Vorwärtsvektor berechnet, anstatt nur eine Kopie zu sein? –