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

Aktuelle Zeit: Fr Jul 18, 2025 12:42

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Richtig drehen
BeitragVerfasst: Di Mai 30, 2006 23:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Hallo Leute,

ich hab nen Drehwurm! Nee, mal im Ernst: Ich versuche gerade eine halbwegs Universelle Library zu schreiben und bin jetzt bei der Camera. Dabei habe ich ein Problem, das ich bisher immer recht unelegant gelöst habe, nun sollte es aber schon richtig sein:

Um welche Achse muss ich zuerst rotieren, damit das CAD-ähnlich aussieht? Oder doch besser alle auf einmal mit ner Matrix(wenn ja, wie genau? Ein bisschen Matrizen mach ich auch immer mal, aber trotz 3maligem Lesen eurer Tuts hab ich das noch nicht wirklich drin :( )

Wen's interessiert: hier der interessante Teil der Camera:
Code:
  1.  
  2. procedure TfglCamera.SetPosition;
  3.   procedure Rotate;
  4.   begin
  5.     glRotatef(FRotatX,1,0,0);
  6.     glRotatef(FRotatY,0,1,0);
  7.     glRotatef(FRotatZ,0,0,1);
  8.   end;
  9.  
  10. begin
  11.   glMatrixMode(GL_PROJECTION); // Kameraparameter!
  12.   glViewport(0,0,FScene.FWW,FScene.FWH);
  13.   glLoadIdentity();            // zuruecksetzen
  14.   gluPerspective(FFOV,FScene.FWW/FScene.FWH,FNearClip,FFarClip);
  15.  
  16.   glMatrixMode(GL_MODELVIEW);  // Blickpunkt!
  17.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  18.   glLoadIdentity();            // Kamera an den Ursprung setzen
  19.  
  20.   case Mode of
  21.     cmLookAt : begin   // von FPosition nach FLookPos gucken
  22.                  gluLookAt(FPosition[0],FPosition[1],FPosition[2],
  23.                            FLookAt[0],FLookAt[1],FLookAt[2],0,1,0);
  24.                end;
  25.     cmLookFromPos : begin   // von FPosition in Richtung gucken
  26.                  Rotate;
  27.                  glTranslatef(-FPosition[0],-FPosition[1],-FPosition[2]);
  28.                end;
  29.     cmPosIsCenter : begin   // auf FPosition aus Richtung gucken
  30.                  glTranslatef(0,0,-FDistToObj);
  31.                  Rotate;
  32.                  //  glTranslatef(-FPosition[0],-FPosition[1],-FPosition[2]);
  33.                end;
  34.   end;
  35. end;


Und noch eins: Wie griege ich das dann auf Maus-Bewegiungen in 2 Achsen umgewandelt? Hab jetzt das drin:
Code:
  1.  
  2. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  3.   Y: Integer);
  4. begin
  5.   if MouseCapture then
  6.   begin
  7.     if MouseB=mbRight then begin
  8.       Scene.Camera.RotationZ := Scene.Camera.RotationZ + ((MouseX - X) / 3);
  9.       Scene.Camera.RotationX := Scene.Camera.RotationX + ((MouseY - Y) / 3);
  10.     end;
  11.     if MouseB=mbMiddle then begin
  12.       Scene.Camera.DistToObj := Scene.Camera.DistToObj + ((MouseY - Y) / 3);
  13.     end;
  14.     MouseX := X;
  15.     MouseY := Y;
  16.   end
  17. end;
  18.  

Da fehlt aber die Rotation um die Y-Achse, wenn das Modell ungünstig steht wird's rightig unhandlich...

OK, das sind zwar Einsteigerfragen, aber eigentlich bin ich das schon nicht mehr...(behaupte ich mal so *g*)

PS: gibts im Deutschen sowas wie 'Thanks in advance?', das würde nämich hier hingehören :D

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 31, 2006 00:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm... "Danke im voraus?"

Hast du mal das Tutorial_Matrix2 angelesen?

Außerdem gibt im Wiki auch was zum Thema Kamera.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 31, 2006 00:41 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Flash hat geschrieben:
Öhm... "Danke im voraus?"

Schon klar, klingt aber irgendwie blöd. Und weglassen fände ich dann doch unhöflich.

Flash hat geschrieben:
Hast du mal das Tutorial_Matrix2 angelesen?

Ja, ich glaube es sogar vertanden zu haben, aber das Verhalten von OpenGL birngt mich immer wieder durcheinander
erst glRotate um die X-Achse ist was anderes als erst um de Y-Achse usw.)

Flash hat geschrieben:
Außerdem gibt im Wiki auch was zum Thema Kamera.

Ja, die ist genial. Aber als ich damit (mit fglLib) angefangen hab hatte ich die nicht wirklich verstanden und wollte deshalb meine eigene, 'einfachere' schreiben. Ich glaube das lass ich besser... Ich werde mich mit der mal eingehend beschäftigen, danke für den Hinweis. Davon werde ich sicherlich einiges bei mir einbauen (hoffentlich gibts keine Copyrightprobleme, aber der Code hier dürfte wohl GPL sein ;) )

Streich dir in Gedanken den vorletzten Satz von meinem Anfangsposting....

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 31, 2006 10:08 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Ist aber doch eigentlich logisch. Jede Rotation resultiert in einer Matrix, die mit der aktuellen Matrix multipliziert wird, und da bei Matrixmultiplikation das Kommutativgesetz nicht gilt (A x B <> B x A), ist die Reihenfolge durchaus entscheidend.

Als Beispiel hierfür fällt mit da spontan eine Flak ein. Diese hat doch einen Rotationskranz und eine Neigungseinrichtung. Beide resultieren in der Rotation des Geschützlaufes (Kranz um y, Neigung um (rotiertes) x). Würde man nun zuerst die Neigungseinrichtung auf die Lafette setzen, und auf diese dann den Rotationskranz würde der Lauf nichtmehr den ganzen Himmel anvisieren können(Neigung um x, Kranz um (rotiertes) y).

p.s.: Wem dieses Beispiel zu militant ist, der nehme einen Schaufelbagger.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 31, 2006 10:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Tja, das kmische ist ja, eine Flak mache ich auf anhieb richtig. Nur Kameras(die ja auch nichts anderes sind ;) ) klappen irgendwie nicht.

Sidorion hat geschrieben:
p.s.: Wem dieses Beispiel zu militant ist, der nehme einen Schaufelbagger.

Der ist gut!

Ich hab jetzt Andys Kamera bei mit integriert, nur sehe ich nocht nichts. Mal sehen, irgendwo geht mir die IdentityMatrix verloren.
EDIT: ich schreibe einfch zu schnell. Geht alles super, aber mein Viewport war der Kamera-Umstellung zum Opfer gefallen.

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 31, 2006 13:01 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Zitat:
Tja, das kmische ist ja, eine Flak mache ich auf anhieb richtig.

Ein Naturtalent !! :twisted:
Probier den mal:
Code:
  1. Procedure TCamera.Rotate(_dForward,_dRight,_dUp: GLdouble);
  2. Var
  3.   oDirForward: TGLVector;
  4.   oMatForward: TGLMatrix;
  5.   oDirRight: TGLVector;
  6.   oMatRight: TGLMatrix;
  7.   oDirUp: TGLVector;
  8.   oMatUp: TGLMatrix;
  9.   oDirection: TGLVector;
  10. Begin
  11.   oDirection:=VecSub(oCenter,oEye);
  12.   oDirForward:=VecNormalize(oDirection);
  13.   oDirRight:=VecMultX(oDirForward,oUp);
  14.   oDirUp:=VecMultX(oDirRight,oDirForward);
  15.   If _dForward<>0
  16.   Then Begin
  17.     oMatForward:=VecToRotationMatrix(oDirForward,_dForward);
  18.     oDirection:=vecMult(oDirection,oMatForward);
  19.   End;
  20.   If _dRight<>0
  21.   Then Begin
  22.     oMatRight:=VecToRotationMatrix(oDirRight,_dRight);
  23.     oDirection:=vecMult(oDirection,oMatRight);
  24.   End;
  25.   If _dUp<>0
  26.   Then begin
  27.     oMatUp:=VecToRotationMatrix(oDirUp,_dUp);
  28.     oDirection:=vecMult(oDirection,oMatUp);
  29.   End;
  30.   oCenter:=vecAdd(oEye,oDirection);
  31. End;

Die Vec.. Funktionen sind aus der gl.pas von Tom Nydens http://www.delphi3d.net,[edit] hab ich doch selber geschrieben, sollten aber klar sein. Wenn nicht fragen[/edit]
Ich mach da folgendes: erst ermittle ich aus dem Aug- und Blickpunkt die Blickrichtung, diese wird dann nacheinander um die jeweiligen Achsen gedreht und der Blickpunkt wieder aus Augpunkt und neuer Blickrichtung berechnet.
Dabei wird allerdings der Upvektor nicht verändert. Das ist wichtig fürs gluLookAt (wenn Du den mitdrehst, verhält sich die Kamera wirklich komisch).
p.s.: wenn Du die Kamera um den Blickpunkt drehen willst, musst Du einfach anstelle des neuen Blickpunktes den neuen Augpunkt aus der neuen Blickrichtung berechnen.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]