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

Aktuelle Zeit: So Dez 22, 2024 08:55

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kugel - Rotation ???
BeitragVerfasst: Mo Okt 27, 2008 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Hi ich habe ein Problem:

Ich habe eine kugel, die über den Boden rollens soll.

Nun will ich erreichen, dass sich die Kugel ganz normla dreht.

Wie muss ich nun die kugel dafür drehen.

(Neuer Bewegungsvektor nach der letzten Kollision ist bekannt)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 10:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich würde mal spontan behaupten, dass du die Teilstrecke der Kugel zu deren Umfang ins Verhältniss setzen kannst. Also wenn deine Kugel einen Umfang von 10 OpenGL Einheiten hat und sie sich aber im Vergleich zum letzten Frame um 1 OpenGL bewegt hat, dann musst du sie um 1/10tel (36 Grad) drehen. Diese 36 Grad musst du aber in Anhängigkeit vom Richtungsvektor auf X und Z aufteilen. Dazu kannst du Sinus und Kosinus verwenden.

Entsprechend benötigst du den Umfang deiner Kugel, die zurückgelegte Strecke und den Richtungsvektor. Alles Andere sollte mit dem Dreisatz bzw Sinus/Kosinus machbar sein.

PS: Hab das Thema mal ins Matheforum verschoben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 11:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hm, das klingt kompliziert. Vielleicht ist es viel einfacher? Wir brauchen doch nur eine Rotationsachse und eine Winkelgeschwindigkeit für glRotate.

Die Rotationsachse müsste dann doch einfach das Kreuzprodukt aus dem Bewegungsvektor und einem Vektor sein, der gerade nach oben zeigt: (0/1/0). Nicht vergessen: Rotationsachse normalisieren.

Den erwähnten Bewegungsvektor interpretiere ich mal als Richtungsvektor, dessen Länge die Geschwindigkeit angibt, OK? Wir haben also die Geschwindigkeit pro Sekunde. Den Radius der Kugel brauchen wir auch. Damit kannst Du Dir ausrechnen, wieviel vom Umfang der Kugel abgerollt werden muss, damit Du genau auf Deine vorgegebene Geschwindigkeit kommst. Ich hoffe, ich habe mich verständlich ausgedrückt.
Traude


EDIT: Verflixt, hab schon wieder etwas vergessen: Rotieren kann man die Kugel nur, wenn sie am Koordinatenursprung ist. Anschließend musst Du sie mit Translate verschieben. Aber - wie wir schon mal irgendwo festegestellt haben, geht das nicht so

1) glRotate
2) glTranslate

SONDERN GENAU UMGEKEHRT:

1) glTranslate
2) glRotate


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 12:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Vielen vielen DANK! :D

Ich konnte das Problem lösen.

Der Tipp mit dem Kreuzprodukt war gut:

Ich hab ein wenig rumprobiert und kam auf diese Lösung!

Code:
  1.  
  2.   //vars
  3.     KugelPos  : TVector3f;
  4.     Rotvel      : TVector3f;  // Der Bewegungsvektor, der nach der LETZTEN KOLLISION errechnet wurde
  5.                                       // Wird später noch wenn es möglich ist so verändert, dass die
  6.                                       // Normale der Ebene, mit der Kollidiert wurde, mit einbezogen wird.
  7.     Rotmatrix : TMatrix;     // Rotationsmatrix der Kugel für "ruckelfreies" Rollen
  8.  
  9. //========================
  10. //Kugel Rotation
  11. //========================
  12. var
  13.   v: TVector3f;
  14. //======
  15.   v := VectorCrossProduct(Rotvel,Vector(0,1,0));
  16.   Normalize(v);
  17.  
  18.   glPushMatrix;
  19.   glLoadIdentity;                                              
  20.   glRotatef(-VectorLength(Rotvel), v.X, v.Y, v.Z);  // Matrix Rotieren
  21.   glMultMatrixf(@Rotmatrix);
  22.   glGetFloatv(FromMatrix, Pointer(Matrix));  // Die veränderte matrix abspeichern
  23.  
  24.   glPopMatrix;
  25.  
  26. //========================
  27. //Rendering
  28. //========================
  29.   glTranslateVect(KugelPos);
  30.   glMultMatrixf(@Rotmatrix);
  31.   << Draw >>
  32.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 12:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Habe den code nochmal verbessern können.

Jetzt stimmt die Rotation auch, wenn man z.b. an einer Wand entlangrollt (also die kugel schräg gegen ne wand fliegt)

Code:
  1.  
  2. //=====================================
  3. // OnCreate - Initialisieren der Rotationsmatrix
  4. //=====================================
  5.   glPushMatrix;
  6.   glLoadIdentity;
  7.   GetMatrix(@Rotmatrix);
  8.   glPopMatrix;
  9.  
  10. //=====================================
  11. // Bei einer Kollision wird die Rotationsachse und die Geschwindigkeit berechnet
  12. //=====================================
  13.       RollAxis := VEL;  // Vel = neuer Bewegungsvektor
  14.       RollAxis := VectorCrossProduct(RollAxis,PolyNormal);  // PolyNormal = Normale des polygons, mit dem kollidiert wurde
  15.       Rollspeed := VectorLength(RollAxis);
  16.       Normalize(RollAxis);
  17.  
  18. //=====================================
  19. //Berechnung der Rotationsmatrix
  20. //=====================================
  21.   glPushMatrix;
  22.  
  23.   glLoadIdentity;
  24.   glRotatef(-RollSpeed, RollAxis.X, RollAxis.Y, RollAxis.Z);
  25.   glMultMatrixf(@Rotmatrix);
  26.   GetMatrix(@Rotmatrix);
  27.  
  28.   glPopMatrix;
  29.  
  30. //=====================================
  31. // Rendering
  32. //=====================================
  33.   glTranslateVect(position);
  34.   glMultMatrixf(@Rotmatrix);
  35.   << DRAW >>
  36.  
  37.  


MFG Björn


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hey, da ist ja einer an Physik interessiert! Und rechnet mit Matrizen!!! Ich dachte, diese Spezies ist in letzter Zeit ausgestorben. :wink:
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 28, 2008 19:34 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@olee: Wie wäre es, wenn du deinen Code im Wiki unter "Techniken und Algortihmen" reinstellst?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 27, 2008 01:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Wow hätte nicht gedacht auf so eine Reaktion zu stoßen.

Ich habe nebenbei das gleiche auch für 2D hinbekommen.
Da ist das Verfahren ähnlich, aber eben doch anders.

Also ich fänds gut wenn man sowas ins Wiki nimmt.
Kannst du das nicht machen Flash?
Ich habe da keinen Account und ich kann das nnicht wirklich gut erklären.

MFG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 27, 2008 23:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich kanns gar nicht erklären. ;)
Schreib eine PM an Flo oder Phobeus. (Flo geht vermutlich schneller, da Phob ziemlich ausgelastet ist)
Der "befördert" dich dann zum Mitglieder der Wiki Gruppe. Schon kannst du dich im Wiki mit deinem Account einloggen.

Es gibt noch einen Grund, wieso ich das nicht machen will: Ich möchte gern, dass mehr DGLer im Wiki auch schreiben. Nicht nur lesen. ;)
Vor allem wenn sie was interessantes beizutragen haben.

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


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


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.025s | 16 Queries | GZIP : On ]