OpenGL - Würfel mit Maus drehen
-
Hallo,
ich bin relativ (um nicht zu sagen GANZ neu) bei der Programmierung mit GLUT oder allgemein OpenGL.
Ich habe vor, einen Würfel zeichnen zu lassen, und diesen mit der Maus anfassen und bewegen zu können.
Das Anzeigen ist auch kein Problem, aber beim drehen habe ich noch ein paar Probleme...
zzt. bin ich so weit:glRotatef(rot_x*-0.1f, 0, 1, 0); glRotatef(rot_y*-0.1f, 1, 0, 0);den Würfel drehen will, drehe ich den würfel immer nur um die selbe Achse. Das heißt:
wenn ich den Würfel in der Anfangsposition dehe, stimmt alles. Doch wenn der Würfel mal um 90° auf die Seite gekippt ist, dann stimmen die Richtungen, in die ich den Würfel drehe nicht mehr. (außer ich drehe meinen Bildschirm auch um 90°, dann passt's wieder)Kann mir einen einen Tipp geben?
-
hi,
zeig doch mal den code mitdem du die maus-position abfragst - die solltest du dann ja in ogl-coords umwandeln.mfg blan
-
wenn der Effekt auftritt, dann schau dir mal die Rotationsmatrix an - ich neheme mal an, das in der Rotationsmatrix viele Nullen stehen - wenn man etwas mit Null multipliziert dann ist es wieder null - dadurch vielierst du wahrscheinlich die möglichkeit um eine Achse zu drehen und musst diesen Falle gesondert behandeln - vielleicht liegts aber auch an etwas anderem

-
wenn du rotate verwendest, wird das koordinaten system transformiert. d.h. drehst du um 90° um x, liegt dein koordinatensystem plötzlich auf der seite. beispielsweise zeige zeigte z vormals nach oben und nun zeigt es zur seite.
wenn du jetzt deine drehung beispielsweise davon abhängig machst, ob die maus horizontal oder vertikal über den bildschirm bewegt wird, so stimmt das in der ursprungsansicht vielleicht mit den gewünschten achsen überein (maus nach oben = z-achse, maus zur seite = y-achse), aber sobald einmal rotiert wurde, bewegt sich die maus relativ zu den rotierten achsen. wenn du diese information ungefiltert für noch eine rotation um x nimmst, dann dreht sich der würfel scheinbar falsch.
in wirklichkeit dreht er sich aber immer um seine x,y,z-achsen.
hm, verständlich?
um das zu umgehen, musst du dir merken, wie der würfel bereits gedreht wurde. wenn nun ein maus input kommt, wird dieser mit der aktuellen würfellage verglichen und die rotation findet dann nicht um die basisachsen (1,0,0) etc. statt, sondern um achsen, die aus benutzersicht "nach oben, hinten und rechts" zeigen. das wär bei entsprechender rotation vielleicht die achse (0.2, 0.5, 0.1) o.ä.
das ganze klingt kompliziert, ist aber mit ein paar transformationsmatrizen umsetzbar.
anmerkung zu opengl: kann sein, dass du das koordinatensystem erhältst, indem du das zeichnen deines würfels in glPushMatrix() und glPopMatrix() "einklammerst". weiss grad nich, wie genau das bei ogl funktioniert.
-
danke für die antworten.
ich habe verstanden, wie du das mit den rotationsachsen meinst, nur ich weiss nicht, wie ich das umsetzten soll.
mit push-/popMatrix() funktioniert es nicht.