2010-01-13 9 views
5

Ich programmiere ein Spiel in C# die XNA3.1-Engine. Jedoch habe ich ein kleines Problem mit meiner Kamera habe, im Grunde meine Kamera „Flip“ neigt, wenn es mehr als 180 Grad auf seiner Rolle dreht (wenn die Kamera 180 Grad erreicht, so scheint es, wieder auf 0 Grad zu drehen). Der Code für die Ansichtsmatrix zu erhalten, ist wie folgt:Kamera Flip Problem

Globals.g_GameProcessingInfo.camera.viewMat = Matrix.CreateLookAt(Globals.g_GameProcessingInfo.camera.target.pos, Globals.g_GameProcessingInfo.camera.LookAt, up);    //Calculate the view matrix 

Die Globals.g_GameProcessingInfo.camera.LookAt Variable die Position 1 Einheit direkt vor der Kamera relativ zu der Drehung der Kamera, und die „up“ Variable wird mit dem erhaltenen folgende Funktion:

static Vector3 GetUp()  //Get the up Vector of the camera 
{ 
    Vector3 up = Vector3.Zero; 
    Quaternion quat = Quaternion.Identity; 
    Quaternion.CreateFromYawPitchRoll(Globals.g_GameProcessingInfo.camera.target.rot.Y, Globals.g_GameProcessingInfo.camera.target.rot.X, Globals.g_GameProcessingInfo.camera.target.rot.Z, out quat); 

    up.X = 2 * quat.X * quat.Y - 2 * quat.W * quat.Z;  //Set the up x-value based on the orientation of the camera 
    up.Y = 1 - 2 * quat.X * quat.Z - 2 * quat.Z * quat.Z; //Set the up y-value based on the orientation of the camera 
    up.Z = 2 * quat.Z * quat.Y + 2 * quat.W * quat.X;  //Set the up z-value based on the orientation of the camera 
    return up;  //Return the up Vector3 
} 
+0

Nur um zu aktualisieren, habe ich die Funktion zur Transformation des Up-Vektors basierend auf der Kameradrehung durch die Verwendung der "Vector.Transform()" implementiert. Ich könnte dann aber das Problem verursachen, wenn der "up" Vektor gleich dem "look at" Vektor ist und deshalb umgedreht wurde (wie es das Problem in vorherigen Spielen war). Nach der Neucodierung der Funktion zur Aktualisierung der Blickposition neigt die Kamera immer noch dazu, im selben Bereich zu spiegeln, und es passiert nichts dramatisches mit der Drehung oder dem Blick auf die Variablen der Kamera. –

+0

Versuchen Sie, die Frage zu bearbeiten, anstatt einen Kommentar zu Ihrer eigenen Frage hinzuzufügen, wenn Sie zusätzliche Informationen hinzufügen. Kommentare sind eine Methode, um die Antworten anderer oder die Kommentare anderer zu diskutieren oder zu kommentieren. – Manish

Antwort

1

Ich habe dieselben Probleme in OpenGL mit gluLookAt. Ich habe das Problem mit meiner eigenen Kameraklasse behoben:

void Camera::ComputeVectors() 
{ 
    Matrix4x4 rotX, rotZ; 
    Quaternion q_x, q_y, q_z; 
    Quaternion q_yx, q_yz; 
    q_x.FromAngleAxis(radians.x, startAxisX); 
    q_y.FromAngleAxis(radians.y, startAxisY); 
    q_z.FromAngleAxis(radians.z, startAxisZ); 
    q_yx = q_y * q_x; 
    q_yx.ToMatrix(rotZ); 
    q_yz = q_y * q_z; 
    q_yz.ToMatrix(rotX); 
    axisX = startAxisX; 
    axisZ = startAxisZ; 
    axisX.Transform(rotX); 
    axisZ.Transform(rotZ); 
    axisY = axisX.Cross(axisZ); 

    position = startPosition; 
    position -= center; 
    position.Transform(q_yx); 
    position += center; 
} 

Es ist vielleicht zu kompliziert, aber funktioniert. axisY ist Ihr hoher Vektor. Vollständige Codeauflistung ist an: http://github.com/filipkunc/opengl-editor-cocoa/blob/master/PureCpp/MathCore/Camera.cpp

Hoffnung hilft es.

+0

hey Mann, vielen Dank dafür, es hat definitiv geholfen und das Problem ist jetzt gelöst, weiß nicht, was schief gelaufen ist, aber diese Funktion hat das Problem gelöst: D. –

0

meh hatte gehofft, dort irgendwo eine Bräune zu sehen.

können Sie einen Link, wo Sie Ihre Gleichung bekam von bitte? (bin bei der Arbeit und wirklich don; t wollen mich hinsetzen und ableiten)

Wie stellen Sie Ihre Kameradrehung ein? Bist du sicher, dass dort nichts läuft?

+0

Ich habe die Gleichung von einigen alten Vorlesungsfolien erhalten, die ich beim Abschluss meines Programmierstudiums gesehen habe. Es ist die rein mathematische Methode, den Aufwärtsvektor basierend auf einer Quaternion-Rotation zu berechnen. Ich setze die Kamerarotation in verschiedenen Bereichen während des Spiels durch die Verwendung eines Vector3 (Pitch, Gier, Roll) und ich kann nichts Lustiges dort sehen. –

0

Ich bin ein wenig unsicher über die Mathematik in Ihrer GetUp Methode. Können Sie die Mathematik dahinter erläutern?

In meiner lookat Kamera initialisieren ich meine up-Vektor einmal und drehen dann diesen Vektor ein quaternion verwenden. Dies beseitigt die Möglichkeit, zu versuchen, ein Kreuzprodukt auf parallele Vektoren zu tun, um den Aufwärts-Vektor zu berechnen.

Einige semicode zu klären, vielleicht:

var up = Vector3.Up; 
var target = <some point in space>; 
var rotation = <current rotation quaternion>; 

var forward = target - position; 
forward = Vector3.Transform(forward, rotation); 

var updatedPosition = target - forward; 
var updatedUp = Vector3.Transform(up, rotation); 

var view = Matrix.CreateLookAt(updatedPosition, target, updatedUp); 
+0

Der Code in der GetUp-Methode ist ein Ausschnitt aus dem Kamera-Code, den ich normalerweise verwende, den ich ursprünglich von meinen Vorlesungsfolien aus meinem Programmier-Abschluss geholt habe. Es ist eine Weile her, dass ich die eigentliche Mathematik dahinter analysiert habe, aber uns wurde im Grunde gesagt "das wird dir die Richtung geben, basierend auf einer Orientierung" (und es hat in früheren Projekten funktioniert, an denen ich gearbeitet habe). Ich sehe, wie du es erklärst, und ich werde es versuchen, weil es weniger kompliziert ist und mathematische Fehler ausschließen würde. –

+0

Ich stimme zu, Up.z fühlt sich wie ein "-" irgendwo. –

1

Dies ist wahrscheinlich langsamer, aber der einzige Weg, ich mit dem zu tun wissen, wäre die mit der Rotationsmatrix für 3D. Wikipedia Link

alt text

Wo

alt text

und U = (Camera.position - Camera.lookat) .norm

... Nun, ich glaube, dass Sie würde die Rotationsteil der Ansichtsmatrix. Aber ich bin nicht 100% darauf. Ich denke aber immer noch darüber nach.

+0

hmmm sieht interessant aus, ich werde einen Blick darauf werfen, aber ich bin ziemlich sicher, dass ich die richtige Richtung richtig finde. Danke für die Info tho –

0

Da ich mit den Antworten hier schon nicht zufrieden war, musste ich das selbst herausfinden.

Was ich entdeckte, ist es eigentlich ziemlich einfach. Tun Sie dies einfach:

Matrix ypr = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll); 
Vector3 up = Vector3.Transform(Vector3.Up, ypr); 

"oben" ist die Richtung, die Sie wollen.