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