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

Aktuelle Zeit: Fr Jul 18, 2025 04:39

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



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rotation mit scenegraph
BeitragVerfasst: Do Feb 26, 2009 20:31 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 20
In meinem scenegraph berechne ich mit einem Durchgang von den Blättern zur Wuzel die Weltkoordinaten der Blätter.
Jedes Blatt hat einen Vektor und eine Roation(3 Winkel) der von den Knoten(Transformation oder Rotation) entsprechent manipuliert werden.

Bei einem Rotations Knoten addiere ich die Winkel des Knoten zu dem der Blätter und drehe den Vektor mit einer Rotationsmatrix.

Roations Knoten (Rotation ist ein e<klkasse die X,Y und Z WInkel speichert)
Code:
  1.   public void processPosition(Vector3D aPosition) {
  2.     aPosition.rotateX(rotation_.getXangle());
  3.     aPosition.rotateY(rotation_.getYangle());
  4.     aPosition.rotateZ(rotation_.getZangle());
  5.   }
  6.  
  7.   public void processRotation(Rotation aRotation) {
  8.     aRotation.add(rotation_);
  9.   }



Roation der Vektoren
Code:
  1.    /**
  2.    * rotations about the x axe   right-handed
  3.    * @param angle  angle in degrees
  4.    */
  5.   public void rotateX(float aAngle){
  6.     float tmpy=y_;//temp variables are important
  7.     float tmpz=z_;
  8.     double angelerad=Math.toRadians(aAngle);
  9.     tmpy=(float)(y_*Math.cos(angelerad)+z_*Math.sin(angelerad));
  10.     tmpz=(float)(y_*-Math.sin(angelerad)+z_*Math.cos(angelerad));
  11.     y_ = tmpy;
  12.     z_ = tmpz;
  13.   }
  14.  
  15.   /**
  16.    * rotations about the y axe  right-handed
  17.    * @param angle  angle in degrees
  18.    */
  19.   public void rotateY(float aAngle){
  20.     float tmpx=x_;//temp variables are important
  21.     float tmpz=z_;
  22.     double angelerad=Math.toRadians(aAngle);
  23.     tmpx=(float)(x_*Math.cos(angelerad)-z_*Math.sin(angelerad));
  24.     tmpz=(float)(x_*Math.sin(angelerad)+z_*Math.cos(angelerad));
  25.     x_ = tmpx;
  26.     z_ = tmpz;
  27.   }
  28.  
  29.   /**
  30.    * rotations about the z axe  right-handed
  31.    * @param angle  angle in degrees
  32.    */
  33.   public void rotateZ(float aAngle){
  34.     float tmpx=x_;//temp variables are important
  35.     float tmpy=y_;
  36.     double angelerad=Math.toRadians(aAngle);
  37.     tmpx=(float)(x_*Math.cos(angelerad)+y_*Math.sin(angelerad));
  38.     tmpy=(float)(x_*-Math.sin(angelerad)+y_*Math.cos(angelerad));
  39.     x_ = tmpx;
  40.     y_ = tmpy;
  41.   }


Rendern
Code:
  1.  
  2.   public void startSetPosition(float aXpos, float aYpos, float aZpos, float aXrot, float aYrot, float aZrot){
  3.     gl.glTranslatef(aXpos, aYpos, aZpos);
  4.     if (aXrot!=0) gl.glRotatef(aXrot, 1, 0, 0);
  5.     if (aYrot!=0) gl.glRotatef(aYrot, 0, 1, 0);
  6.     if (aZrot!=0) gl.glRotatef(aZrot, 0, 0, 1);
  7.   }



Nun wo ist der Fehler? Die Positionsberechnung scheint richtig zu sein aber nicht die Drehung der Blätter.

mfg[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 26, 2009 23:15 
Offline
DGL Member

Registriert: Mi Mai 30, 2007 15:15
Beiträge: 20
Beispiel:
Position(0,0,-100)
Rotation(0,0,0) setSpeed(0,0,0.07)
Position(0,20,0)
Würfel(4,4,4)

Würfel dreht sich mit Abstand 20 um punkt 0,0,-100.
Fehler: Gleiche Seite sollte immer zum Zentrum ausgerichtet sein. (wie beim Mond)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 27, 2009 00:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ähem, ich verstehe das jetzt so:

Gefordertes Verhalten:
Du hast einen Würfel mit Kantenlänge 4. Dieser soll sich mit einem Abstand von 20 um den Punkt (0,0,-100) drehen, wobei die Front des Würfels (die wir irgendwie gekennzeichnet haben), immer dem Punkt (0,0,-100) zugekehrt sein soll (eben wie der Mond).


Dann mache ich das wie folgt:

Ich habe ein Würfelmodell, dessen Mittelpunkt in (0,0,0) liegt. Seine Front schaut (soweit man bei einem Würfel von Schauen sprechen kann) in die Richtung (0,0,+1), also der positive Z-Vektor.

Diesen Würfel verschiebe ich jetzt mit dem Vektor (0,0,-20) mit einer Translationsmatrix, sozusagen „nach hinten“.
Dann rotiere ich den Würfel um die Y-Achse (oder auch um eine beliebige andere Achse) mit einer Rotationsmatrix. Seine Front ist dabei immer dem Koordinatenursprung zugekehrt. Rotationsachse ist daher (0,1,0), Winkelgeschwindigkeit ist jedenfalls ungleich Null.
Zuletzt verschiebe ich das ganze Gebilde um den Vektor (0,0,-100) mit einer zweiten Translationsmatrix.

Das Ergebnis sollte das oben geforderte Verhalten zeigen. Ich hab es bei mir eben ausprobiert, allerdings mit den ganz normalen Translate/Rotate Befehlen und es funktioniert.

Ich weiß jetzt aber nicht, ob ich Dein Problem richtig verstehe. Aufgeschrieben hast Du es fast richtig, nur die Rotation braucht eine Rotationsachse, aber (0,0,0) ist jedenfalls keine gültige Rotationsachse.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.006s | 14 Queries | GZIP : On ]