Ich habe ein Objekt, dass ich Selektieren kann. z.B ein Torus. Dieses Objekt wird, wenn ich mit der rechten maustaste draufklicke rotiert. Wenn ich die maus horizontal bewege, dann rotiert der Torus in der y-Achse und wenn ich die maus vertikal bewege, dann rotiert der Torus in der y-Achse.
Soweit so gut.
Was ich machen wil ist:
Wenn ich die Maus nun bewege, soll die rotation wie oben erfolgen, aber der Mauscourser soll sich dabei nicht bewegen, spricht an der gleichen Stelle bleiben, wo ich hingeklickt habe. Hoffe es ist verständlich was ich meine.
Wie könnte man das machen?
Gruss
Zuletzt geändert von Real_Oglum am So Nov 27, 2005 13:53, insgesamt 1-mal geändert.
Gibt es da ne Möglichkeit das direkt in OpenGL zu machen, also ohne die Funktionen SetCursorPos() und GetCursorPos() zubenutzen?
Ich benutze GLUT. Um die Mausposition zu ermitteln habe ich eine Funktion void mouseMotion(int x, int y) als Callback registriert( glutMotionFunc(motionCB) ), die mir die Positionskoordinaten liefert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also die Glut ist veraltet. Da wäre es besser auf etwas anders zu setzen. SDL zum beispiel. Und die Maus hat nichts mit OpenGL zu tun. Das ist Sache vom Betriebssystem. Da wirst du wohl oder übel etwas systemspezifisches einbauen müssen. Außer SDL würde das unterstützen. Kenne mich aber nicht so gut damit aus.
Habe aber noch eine kleine Anmerkung zu der Mauspositionierung. Es gibt immer wieder Programme in denen das möglich ist und bei denen bleibt die Maus nicht stehen. Die machen das so, dass wenn die Maus 20 Pixel vorm dem Bildschirmrand ist, dass sie dann auf der anderen seite wieder heraus kommt. Finde ich persönlich auch besser.
Ich habe das mal ausprobiert und in die Prozedur TForm1.FormMouseMove den Befehl SetCursorPos(512, 384); gesetzt.
Das Programm reagiert allerdings dann nicht mehr. Manchmal zeichnet es erst gar nicht die OpenGL Welt, manchmal läuft die Rotation einer Box, die gezeichnet wird, nicht.
Entferne ich SetCursorPos(512, 384); wieder ist alles in Ordnung.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Jo. Wenn du SetCursorPos aufrufst wird die Maus (intern) bewegt. Und wenn die Maus bewegt wird, dann wird ein OnMouseMove ausgelöst. Und wenn ein OnMouseMove ausgelöst wird rufst du SetCursorPos auf. Na hast du ne Ahnung worauf ich hinaus möchte? Du musst dafür sorgen, dass das nicht ständig aufgerufen wird sondern nur manchmal. Ich schaue mal ob ich heute abend meinen Code noch mal finde.
Habe das Thema im Übrigen mal ins Allgemeine verschoben. Da isses besser aufgehoben.
Registriert: So Feb 06, 2005 17:29 Beiträge: 187
Programmiersprache: C, C++
Statt dem OnMouseMove kannst du auch in deiner Hauptschleife die Maus mit GetCursorPos abfragen und hinterher wieder mit SetCursorPos setzen. Das dürfte keine Probleme geben.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Abgesehen davon, dass solch eine Vorgehensweise ein wenig dreckig ist, da man bereits die Informationen gepushed bekommt und mir persönlich wiederstrebt es dann dennoch immer wieder zu pollen. Warum sollte ich also CPU Leistung verbraten, wenn ich die Informationen bereits besitze.
Und ungefährlich ist sie auch nicht. War leider schon ein mal in der misslichen Situation, dass ich die Mausposition pollen durfte. Und kaum hatte man bei Windows XP die Arbeitsstation gesperrt gab es Exceptions! Keine Ahnung warum! Bis wir nach tagelanger Suche herrausgefunden haben, dass sich XP erstmals an seine Standards hält. Hätte in 2000 bereits auch krachen müssen. Normal existiert für die Stationen keine Maus sobald sie gelockt sind und ein abfragen der Position resultiert in einem Fehler.
Wenn man aber die Maus abfragerei so einschränken würde, dass zu erst eine Taste gedrückt werden muss, dann sollte das recht ungefährlich sein. Auch wenn es dadurch dennoch nicht schöner wird.
Registriert: So Feb 06, 2005 17:29 Beiträge: 187
Programmiersprache: C, C++
@Lossy: Danke fuer den Tipp. Ich hab bisher immer die "dreckige" Methode benutzt und auch keine Fehler gehabt, aber wenn es da unter bestimmten Bedingungen zu Fehlern kommt, dann denk ich mir wohl besser eine andere Mausabfrage aus. Thx
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.