2016-07-07 23 views
0

Ich habe einen grundlegenden Würfel in meiner 3D-Welt generiert. Ich kann mich korrekt um die Kamera drehen, aber wenn ich nach dem Drehen übersetze, sind die Übersetzungen nicht korrekt. Wenn ich zum Beispiel um 90 Grad rotiere und in die Z-Achse übersetze, würde es sich so bewegen, als würde es in der X-Achse verschoben.Korrekter Weg, um nach dem Drehen in einer 3D-Welt zu übersetzen?

glLoadIdentity(); 
    glRotatef(angle,0,1,0);  //Rotate around the camera. 
    glTranslatef(movX,movY,movZ); //Translate after rotating around the camera. 
glCallList(cubes[0]); 

Ich brauche Hilfe mit diesem. Außerdem habe ich vor dem Drehen versucht zu übersetzen, aber die Rotation ist nicht in der Kamera. Es ist am Rand des Würfels.

Antwort

0

Denken Sie daran, dass in OpenGL, dass die Transformation auf die Kamera, nicht die gerenderten Objekte angewendet wird; so beobachten Sie die inverse der Transformation, die Sie erwartet haben.

Auch in OpenGL sind die Y- und Z-Achsen gekippt (Y ist vertikal), so dass Sie eine horizontale statt einer vertikalen Verschiebung beobachten.

Da das Objekt um 90 Grad um Y gedreht wird, ersetzen sich die X- und die Z-Achse gegenseitig (eine davon ist umgekehrt).

+0

Dies gab mir einige hilfreiche Informationen. Gibt es nützliche Tutorials, die Sie für das korrekte Übersetzen im 3D-Raum benötigen? – newbcoder

+0

Ich denke gerade lesen Sie eine Koordinatengeometrie und lineare Algebra Lehrbuch, insbesondere Matrixtransformation und Bestellung notieren –

0

Willywonkadailyblahs Antwort ist halb richtig. Da Sie das alte OpenGL verwenden, verwenden Sie den alten Matrixstapel. Sie ändern die Modellansichtsmatrix , wenn Sie Ihre glRotatef- und glTranslatef-Aufrufe ausführen. Die Modelview-Matrix ist eigentlich die Matrix des Modells und die View-Matrix der Kamera vorkombiniert (bereits multipliziert). Diese Matrizen bestimmen, wo sich Ihr Objekt im 3D-Raum befindet und wo sich Ihre Sichtposition/Richtung der Welt befindet. Sie können sich Ihre Anrufe also als Bewegen der Kamera vorstellen, aber es ist wahrscheinlich einfacher, sie so zu sehen, als würden Sie die Welt bewegen und drehen.

Diese Dreh- und Übersetzungsaufrufe sind lineare Transformationen. Dies hat eine genaue Definition, aber für unsere Zwecke bedeutet das, dass Sie die Transformation als eine Matrix darstellen können und Sie sie mit den Koordinaten des Punktes multiplizieren, um die Transformation auf einen Punkt anzuwenden. Jetzt ist die Matrixmultiplikation nicht kommutativ, dh AB! = BA. All das zu sagen, dass, wenn Sie drehen, dann übersetzen Sie es anders als übersetzen und rotieren, was ich denke, Sie wissen. Aber dann, wenn Sie übersetzen, drehen und übersetzen, ist es vielleicht etwas schwieriger, dem zu folgen, was Sie tatsächlich tun. Schlimmer noch, selbst wenn man etwas Skalierung hineinwirft. Ich würde daher vorschlagen, zu lernen, wie lineare Transformationen funktionieren und Ihre eigenen Matrizen für die Objekte und die Kamera zu erhalten, wenn Sie ernsthaft mit OpenGL lernen wollen.

learnopengl.org ist eine ausgezeichnete Website, aber es lehrt Sie Modern OpenGL, nicht das, was Sie gerade verwenden. Aber die Lektion auf und auf coordinate systems sind wahrscheinlich in der Regel hilfreich, auch ohne genauen Code für Sie zu folgen

+0

Ich überprüfe Ihren Link aus und beginne zu folgen/lernen diese Tutorials. Ich habe nie bemerkt, dass es eine neue und eine alte OpenGL gibt, und dass ich die alte verwendet habe. Vielen Dank. – newbcoder

+0

Ja, ich auch nicht bis Anfang dieses Jahres, haha. Ich habe zuerst in der alten OpenGL gelernt. Im alten OpenGL können Sie weiterhin LoadMatrix verwenden, wenn Sie die Modelview-Matrix anstelle von Transformationen übergeben möchten. –