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

Aktuelle Zeit: Di Jul 15, 2025 19:05

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: rotation
BeitragVerfasst: Mi Aug 13, 2003 14:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
wie kann man gleichzeitig um mehrere achsen um jeweils verschiedene gradzahlen rotiern

wenn man die einfach hintereinander schreibt dann wird das nix weil sich die achsen auch drehen ..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2003 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Schau dir mal die Funktionen glPushMatrix und glPopMatrix an, mit denen man die aktuelle Matrix auf einen Stack legen, bzw. wieder herunternehmen kann.Wenn man diese richtig anwendet, ist jede Rotations/Translations- oder Skalierungskombination möglich.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2003 14:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
der gedanke kam mir anfangs auch doch beim "vorstellen" sah ich das folgendes


push
rotation nr 1
pop
rotation nr 2


nicht wirklich functioniern kann weil es doch die 1. rotation wieder überschreibt und somit nur die 2. macht

und andere kombinationen fallen mir nicht ein ...


da es sich hier um das einsteiger forum handelt wäre ich durchaus dankbar wenn du mir andere (das problem lösende) anwendungsmöglichkeiten von push und pop aufzeigen könntest ...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2003 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Beschreib mal dein Problem genauer...normalerweise kann man in einem glRotatef alle Achsen rotieren, in dem man die Verhältnisse ausrechnet.

Wenn du also z.B. gleichzeitig X um 45°, Y um 20°C und Z um 60°C drehen willst, dann sollte folgendes funzen :
Code:
  1. glRotatef(60,  0.75,0.3333,1);

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2003 14:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
ah danke ich versuch das dann mal (wobei werte <> 1 bei meinen anfänglichen rotationstests nicht wirklich sichbare auswirkungen zeigten)


naja eigentlich versuche ich nen ball in die richtung "rollen" zu lassen in die er sich bewegt

bei rechts und links klappt das auch schon recht gut (ist die erste rotation)

und bei rauf und runter klappts mal und mal nicht (abhängig davon wie weit man vorher nach links oder rechts gerollt ist)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2003 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
juhu danke das functioniert ..


ka warum das beim drehenden dreieck keine auswirkung hatte ob da nun glrotate(x,0.5,0,0) oder glrotate(x,1,0,0) stand ...
bei der combi rotation sieht er nun doch so aus als würd er sich richtig rum drehen ..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 01:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
ok zu früh gefreut .... hatte es erst mit nem andern beispiel (planeten kreisen um sonne..) probiert wo sich dann die rotation verändert hat

als wir nun ähnliches mit dem ball versuchten scheiterten wir allerdings kläglich was sicher auch daran liegt das man bei glrotate die gradzahl so wie einen richtungsvektor der achse um die man rotieren will als parameter bekommt so stehts zumindest im redbook .. (ob und inwiefern sich dieses mit SoS' aussage deckt vermag ich nicht zu beurteilen)



also dachten wir uns das wir eben erst um die eine achse drehen und dann um die alte position der andern achse

glRotate(zpos*100,1,0,0); // drehung um die x-achse
glRotate(xpos*100,0,-sin(pi*zpos*100/180),-cos(pi*zpos*100/180)); // drehung um die "alte" z-achse

dies funktioniert im bereich um den 0-punkt auf den graden und auf (manchen)diagonalen auch ganz passabel ...

sonst aber nicht ;/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Um das Problem genauer lokalisieren zu können sollten wir evtl. erstmal klarstellen was genau du machen willst.Ich geh mal davon aus, das du ein fest stehendes Spielfeld hast (das sich weder verschiebt noch irgendwie rotiert wird) und darauf dann eine Kugel umherrollt, die sowohl Position als auch Rotation ändert?
Du solltest vielleicht auch mal genauer sagen was xpos und zpos für Werte darstellen?Wenn das die Rotationswerte der Kugel sind um diese in die gewollte Position zu verschieben, dann sind die Variablennamen nämlich etwas schlecht gewählt.

Ausserdem sollte man die Position eines Objektes nicht unbedingt über die Rotationsfunktionen der 3D-API festlegen, sondern nur mittels glTranslatef.
Du verpasst deiner Kugel also ganz einfach nen Richtungswinkel und berechnest die neue Position die du an glTranslatef übergibst dann auch selbt.Bei ner Bewegung auf der X- und Z-Achse sieht die Berechnung für die neue Position der Kugel dann so aus :
Code:
  1. Position.x := Position.x-pMovement.x*(sin(Direction.y*PIOver180) *Speed);
  2. Position.z := Position.z-pMovement.x*(cos(Direction.y*PIOver180) *Speed);
  3. ...
  4. glTranslatef(-Position.x, -Position.y, -Position.z);
  5. // Zeichne Kugel;


Wenn du es so machst anstatt über die glRotate-Funktionen sollte es keine Probleme geben (so mach ich das auch in einem Projekt), dann sparst du dir zum einen den glRotate-Ärger und hast zum anderen auch die konkrete Position deiner Kugel, so dass du genau weisst wo sie im Raum ist.Das wird nämlich spätestens dann nötig, wenn du Sachen wie ne Kollisionsabfrage einbauen willst.

Hoffe mal dein Problem genau getroffen zu haben...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 12:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
Zitat:
naja eigentlich versuche ich nen ball in die richtung "rollen" zu lassen in die er sich bewegt


Code:
  1.  
  2.  // kugelstartposition holen und wieder ablegen
  3.     glPopMatrix;
  4.     glPushMatrix;    
  5. //------------------------------------------
  6. // keyabfrage und bewegung  // wegen dem keybuffer ... reden wir nich drüber ok ? :)
  7.     key:= givekey(kbbuffer);
  8.     if key <> 0 then
  9.     begin
  10.       case key of
  11.         VK_Left: begin
  12.                    xpos:= xpos - 0.01;
  13.                  end;
  14.         VK_Right: begin
  15.                    xpos:= xpos + 0.01;
  16.                  end;
  17.         VK_Up: begin
  18.                    zpos:= zpos - 0.01;
  19.               //  kurve  // xpos:= -0.3*zpos - power(2,-zpos-10);
  20.                  end;
  21.         VK_Down: begin
  22.                    zpos:= zpos + 0.01;
  23.                 //kurve //   xpos:= -0.3*zpos - power(2,-zpos-10);
  24.                  end;
  25.  
  26.       end;
  27.     end;
  28.  
  29.     glTranslate(xpos, 0, zpos);  //bewegung auf dem feld
  30.     glRotate(zpos*100,1,0,0);  
  31.     glRotate(xpos*100,0,-sin(pi*zpos*100/180),-cos(pi*zpos*100/180));
  32. //----------------------------------------------
  33.   end;
  34. // kugel basteln
  35.    glBlendFunc(GL_ONE,GL_ZERO);
  36.    glBindTexture(GL_TEXTURE_2D, tex2);    
  37.     q := gluNewQuadric ( );
  38.     gluQuadricDrawStyle ( q, GLU_FILL );
  39.     gluQuadricNormals   ( q, GLU_SMOOTH );
  40.     gluQuadricTexture   ( q, GL_TRUE );
  41.     glusphere(q,0.05,32,16);
  42.     gluDeleteQuadric ( q );
  43. //---------------------------
  44. end;




wir wollen also anhand der position auf dem feld errechnen welche drehung der ball gemacht hat .. und im endeffect soll er dann eben (erst mal mit gleichbleibender rotationsgeschwindigkeit )in die richtung rollen in die er sich bewegt ..


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


Zuletzt geändert von spooky3do am Sa Aug 16, 2003 12:09, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 12:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich versteh dein Problem zwar immer noch nicht genau, und weis auch absolut nicht was du da machen willst, aber dein Problem lässt sich wohl am besten lösen in dem du eine eigene Rotationsmatrix erstellst und diese dann mittels glMultMatrix mit der aktuellen Modelansichtsmatrix multiplizierst, dann entfällt nämlich auch die Tatsache das durch nacheinander folgende glRotates die Achsen mitrotiert werden.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 12:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
Zitat:
.......Rotationsmatrix erstellst und diese dann mittels glMultMatrix mit der aktuellen Modelansichtsmatrix multiplizierst, dann entfällt nämlich auch die Tatsache das durch nacheinander folgende glRotates die Achsen mitrotiert werden.



das ist soweit ich weis nicht der fall, denn zum einen überschneiden sich die rotationsmatrizen für drehungen innerhalb der verschiedenen achsen (somit fällt kombination in einer matrix schon mal raus) und zum andern ist eine solche matrixmultiplication nichts anderes als die nach einander ausgeführte rotation(wobei "rotationsmatrix für 30° um x-achse" * "rotationsmatrix für 60° um y achse" einem
glrotate(60,0,1,0);
glrotate(30,1,0,0); entspricht also lediglich die reihenfolge umdreht )


dennoch schonmal vielen dank für die mühe früher oder später wird das schon klappen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 12:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Aha...hab grad gesehen das du dein Programm inklusive Quellcode hochgeladen hast.Werds mir dann im Verlaufe des Tages mal ansehen und versuchen ne Lösung für dein Problem rauszufinden, und das sollte mit Quellcode kaum ein Problem sein.
Meld mich dann später wieder...

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 12:35 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
vielen dank ..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 16:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hab mir dein Programm angeguckt, und hab (auch wenn ichs noch nicht probiert hab) ne Idee wie du in deinem ganz spezifischem Fall den Ball richtig rotieren kannst :
Du rotierst die Z-Achse deines Balles anhand der Y-Achse so, das diese immer in die Richtung zeigt, in die der Ball rollt, und wenn die Taste gedrückt wird, dann erhöhst du abhängig von der Richtung in der der Ball gerollt werden soll immer nur die Rotation der Z-Achse.Deine Idee, den Ball abhängig von seiner Position auf dem Feld zu rotieren ist meiner Meinung nach keine gute Lösung, sondern ein tastenabhängiges Rotieren wie ich vorschlage wäre weitaus besser.
Das sieht dann konkret so aus : Wenn der Spieler gleichzeitig Cursor rechts+Cursor hoch drückt, rotierst du den Ball auf der Y-Achse um 45°, so dass die Z-Achse auch (wenn man das Spielfeld von oben betrachtet) nach rechts/oben zeigt.Wenn diese Tastenkombination weiter gedrückt bleibt, erhöhst du permanent nur noch den Wert um den der Ball auf der Z-Achse rotiert werden soll.Genauso machst du es für die anderen 7 Richtungen.
Das ist zwar mehr ein Hack, aber erspart dir das recht komplexe erstellen Rotationsmatrix.
Hoffe mal das diese Lösung brauchbar ist, ansonsten schau dir halt mal unser Mathetut an, in dem auf das Erstellen von Rotationsmatrizen näher eingegangen wird.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2003 19:48 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 11, 2003 18:21
Beiträge: 26
ok danke das werden wir dann einfach mal versuchen


zum thema mathe tutorial ..


hab ich überflogen .. eine sache die anzubringen wär ist vieleicht die tatsache das matrizenmultiplikation im allgemeinen nicht kommutativ ist, wenn man mal von drehungen um eine achse streckungen oder drehstreckungen absieht da diese eine abelsche gruppe bilden (bei diesen spielt also die reihenfolge keine rolle).... ansonsten siehts sehr umfassend und zutreffend aus ...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.011s | 17 Queries | GZIP : On ]