Ich hab leider keine wirkliche idee wie ich es beschreiben soll, deswegen hab ich mal ein Screen Video gemacht.
Das eine (Grauer Hintergrund, Wireframe) ist aus Maya, das andere mit der Grünen Plane von mir. Ich möchte gern die rotation genauso hinbekommen wie sie in Maya ist.
im moment hab ich eine Matrix welche ich je nach maus bewegung um X, bzw Y immer weiter rotiere. Allerdings passiert es da, das wenn ich die Plane 90° um die Y-Achse drehe und dann X-Rotiere die rotation anders ist als wenn ich es in Maya erst um 90° Y rotiere und dann X..
Schwer zu beschreiben, einfach mal die Videos vergleichen
Ich hab die Maya-bewegung hinbekommen gehabt indem ich nicht die Matrix immer weiter rotiere, sondern mir RotateX und RotateY in EulerWinkeln speichere und verändere und dann diese Rotation immer wieder auf eine IdentitätsMatrix anwende.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Ich glaube, du versuchst um die Kamera-Achsen zu drehen (Ich hab mir die Videos nicht angeschaut weil ich mich weigere Appel-Software zu nutzen), zumindest liest sich deine Beschreibung so. Du musst also die Modelmatrix des Objekts um die Achsen der Modelmatrix der Kamera rotieren. Das sollte eigentlich klappen...
Vielleicht erklärst du einmal wie du deinen Matrixstack aufbaust und welche Rotationen in welcher Reihenfolge durchgeführt werden.
Ich hab mir die Videos nicht angeschaut weil ich mich weigere Appel-Software zu nutzen
Dir ist schon klar das es auch andere Player gibt die MOV abspielen können, oder?
Die Modelmatrix der Objekte möchte ich nicht anpassen, mir geht es nur um die Kamerabewegung.
Und das ist im moment ganz simpel einfach nur eine Identitätsmatrix am anfang, die wird um -120 auf z transliert und dann je nach mausbewegung entweder um X oder Y rotiert.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Okay, ich habs mir doch angeschaut (ja du hast recht, es geht >_<" )
Ich nehme mal an, du willst ein Objekt immer im Mittelpunkt haben und darum rotieren können, ohne, dass das Objekt auf die Seite kippt. Für eine solche Kamera hab ich sowas schon gebaut. Bei mir funktioniert das wie folgt:
Ich nehme mal an du kennst dich mit Matrizen in OpenGl aus. Die Kamera und das Objekt haben jeweils eine Matrix die Position und Ausrichtung beschreibt. Erstmal bringt man die Kameramatrix in den selben Raum wie das Objekt. Dazu einfach die Objektmatrix mit der Kameramatrix multiplizieren. jetzt kannst du die Kamera ohne weiteres mit einer Rotationsmatrix um die Kameraeigene X-Achse drehen, oder um die Y-Achse der Objektmatrix. Würdest du hier die Y-Achse der Kameramatrix nehmen würde das Kippen aus deinem 1. Video entstehen. Nach der Rotation muss natürlich die Kameramatrix wieder zurück in seinen eigenen Raum, also die Kamera wieder mit der Inversion der Objektmatrix multiplizieren. Um die Ansicht jetzt verwenden zu können bildest du die Inversion der Kameramatrix und benutzt sie als ModelViewMatrix in Opengl. Wenn es dir hierbei garnicht um das Objekt an sich geht, kannst du deine Kamera auch einfach für die Y-Rotation um die (0,1,0) Achse drehen. Das sollte in der Regel wie bei einer Egoshooter-Cam dafür sorgen, dass das Bild nicht kippt. Bei der Methode mit dem Objekt bezieht sich die Rotation immer auf das Koordinatensystem des Objektes, wenn die Kamera also schon eine schiefe Lage zum Objekt hat, wird die Kamera diese auch behalten, egal wohin sie gedreht wird.
Ich hoffe ich hab da keinen blöden Fehler eingebaut. Meine Implementierung des ganzen ist jetzt bestimmt über ein jahr her und den Sourcecode dazu hab ich seit es funktioniert nicht mehr angeschaut.
das Objekt hat eine Identitäts Matrix, ich will wie gesagt NUR die Kamera bewegen. Aber da passiert es eben das das kippen kommt, welches ich in dem Video zeige..
Hab mir das Video angeschaut, genau so eine Kamera habe ich schon verwendet.
Erstmal ein paar Codeschnippel aus meiner Kamera (Operatoren sind überladen).
Code:
{...}
FMatrix: TMatrix4f; FCenterPos: TVector3f;
{...}
// Bewegt die FCenterPos und somit auch das Auge mit procedure TSR_Camera.MoveCenter(X, Y, Z: Single); var InvMatrix: TMatrix3f; begin InvMatrix := FMatrix.Matrix3f.Inverse; FCenterPos := FCenterPos + InvMatrix * TVector3f.Make(X, Y, Z); end;
// Bewegt das "Auge", wird zb. zum Zoomen verwendet "MoveView(0, 0, Zoom: Single)" procedure TSR_Camera.MoveView(X, Y, Z: Single) begin FMatrix := FMatrix * TMatrix4f.Translate(TVector3f.Make(X, Y, Z)); end
// Rotiert um die FCenterpos, wobei die Rotation um die Y-Achse fixiert ist procedure TSR_Camera.RotateView(X, Y, Z: Single); var InvMatrix: TMatrix4f; begin InvMatrix := FMatrix.Inverse;
if X <> 0 then begin FMatrix := TMatrix4f.RotationAxis(InvMatrix.X, X) * FMatrix; end; if Y <> 0 then begin FMatrix := TMatrix4f.RotationAxis(TVector3f.Make(0, 1, 0), Y) * FMatrix; end; if Z <> 0 then begin FMatrix := TMatrix4f.RotationAxis(InvMatrix.Z, Z) * FMatrix; end; end;
// Kamera anwenden procedure TSR_Camera.Apply; begin glMultMatrix(FMatrix); glTranslatef(-FCenterPos); end;
Die Matrix beinhaltet nur die Rotation und die Verschiebung von CenterPos und "Auge". Zum Verschieben der Kamera wird die Centerposition verwendet. Ob das Verschieben der Kamera genau das ich was du suchst weiß ich nicht, aber hier mal eine Variante.
Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.