Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 19:46

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 14:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich hab ein kleines rotations problem:

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.

Das hat allerdings dann wieder andere nachteile :(

Hat wer ne idee?

Aya~

PS: Die 2 Videos:
http://www.koshigaya.de/misc/Matrix-Rotation-Aya.mov
http://www.koshigaya.de/misc/Matrix-Rotation-Maya.mov


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 15:40 
Offline
DGL Member
Benutzeravatar

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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 17:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Sellmann hat geschrieben:
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? :roll:


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.

Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 19:23 
Offline
DGL Member
Benutzeravatar

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.

Gruß! Ich hoffe ich konnte helfen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 19:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

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..

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 20:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

so in etwa (siehe Anhang):
Code:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then begin
    Turn := Turn - (MousePos.X - X)/2;
    Tilt := Tilt - (MousePos.Y - Y)/2;
  end;
  MousePos := Point(X, Y);
end;

procedure TForm1.Render;
begin
  glClearColor(0,0,0,0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0,0,-5);
  glRotatef(Tilt, 1, 0, 0);
  glRotatef(Turn, 0, 1, 0);

  glColor3f(1,1,1);
  glBegin(GL_LINE_LOOP);
    glVertex3f( 1, 1, 1); glVertex3f( 1,-1, 1);
    glVertex3f(-1,-1, 1); glVertex3f(-1, 1, 1);
    glVertex3f(-1, 1,-1); glVertex3f(-1,-1,-1);
    glVertex3f( 1,-1,-1); glVertex3f( 1, 1,-1);
  glEnd;
  glBegin(GL_LINES);
    glVertex3f( 1,-1, 1); glVertex3f( 1,-1,-1);
    glVertex3f(-1,-1, 1); glVertex3f(-1,-1,-1);
    glVertex3f(-1, 1, 1); glVertex3f( 1, 1, 1);
    glVertex3f(-1, 1,-1); glVertex3f( 1, 1,-1);
  glEnd;

  SwapBuffers(RC.DC);
end;


MfG Bergmann.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Das ist ja die variante in der man sich die rotationswerte merkt und die matrix immer neu erzeugt.

Aber das macht andere Probleme... aber evtl sollte ich mal schauen das ich ein mix aus den beiden varianten bastel, ist vermutlich das geschickteste.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

so?
Code:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then begin
    Cam.WorldRotate(-(MousePos.X - X)/2, gluVector3f(0, 1, 0));
    Cam.SelfRotate(-(MousePos.Y - Y)/2, gluVector3f(1, 0, 0));
  end;
  MousePos := Point(X, Y);
end;

procedure TForm1.Render;
begin
  glClearColor(0,0,0,0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0,0,-5);
  glMultMatrixf(Cam.ValuePointer);

  glColor3f(1,1,1);
  glBegin(GL_LINE_LOOP);
    glVertex3f( 1, 1, 1); glVertex3f( 1,-1, 1);
    glVertex3f(-1,-1, 1); glVertex3f(-1, 1, 1);
    glVertex3f(-1, 1,-1); glVertex3f(-1,-1,-1);
    glVertex3f( 1,-1,-1); glVertex3f( 1, 1,-1);
  glEnd;
  glBegin(GL_LINES);
    glVertex3f( 1,-1, 1); glVertex3f( 1,-1,-1);
    glVertex3f(-1,-1, 1); glVertex3f(-1,-1,-1);
    glVertex3f(-1, 1, 1); glVertex3f( 1, 1, 1);
    glVertex3f(-1, 1,-1); glVertex3f( 1, 1,-1);
  glEnd;

  SwapBuffers(RC.DC);
end;

:)

MfG Bergmann


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 21:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 04, 2008 23:15
Beiträge: 39
Wohnort: Oberösterreich
Programmiersprache: ObjPas, C, DivASM
Hallo,

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.

Hoffe es hilf.

humflo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix rotation im Worldspace?
BeitragVerfasst: Mi Okt 06, 2010 21:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

habs eben grad hinbekommen :)
Hatte nur nen dummen fehler drin, da ich die z-translation immer invertiert hatte.. dadurch war alles kaputt.

Jetzt klappts.

Hab allerdings mir wieder die rotations werte gemerkt und die Matrix jedesmal komplett neu erstellt, nicht die Matrix immer weiter rotiert.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]