PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nagetieranbindung in C++/OGL


Frank
2002-10-21, 23:23:03
Wie bindet man die Mouse in ein OpenGL Progrämmchen ein?

zb:
ich zeichne einen Punkt.
dann will ich diesen anklicken können im ogl-fenster und verschieben können (mousetaste gedrückt lassen).

Xmas
2002-10-22, 12:04:57
OpenGL hat nichts mit der Maus zu tun. Du kannst entweder plattformunabhängig GLUT verwenden oder unter Windows in deiner Fensterprozedur die entsprechenden Messages (WM_LBUTTONDOWN, WM_MOUSEMOVE, ... -> http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput.asp?frame=true) bearbeiten.

zeckensack
2002-10-22, 20:41:15
Richtig.

Die Koordinaten des Mauszeigers bezogen auf den Client-Bereich des Fensters erhält man, indem man WM_MOUSEMOVE messages verarbeitet.

Das muß man dann selbst in Szenenkoordinaten umrechnen, was bei Orthoprojektion (2D halt) eigentlich noch recht einfach gehen sollte.

Das GL-Koordinatensystem reicht von -1 bis +1. Dabei muß man eigentlich nur beachten, daß -1;-1 unten links ist, während Windows oben links mit dem Zählen anfängt. Das kann man mit einer passenden Matrix wieder 'korrigieren'.


Wie man ein Objekt auswählt und verschiebt, das fällt größtenteils aus dem Befugnisbereich von OpenGL heraus, schließlich ist diese API rein für Grafikausgabe zuständig. Man muß die Zuordnung Mauskoordinate -> Objekt leider selbst herstellen.

Als Hilfsmittel für echte Perspektivprojektion gibt es dann gluUnproject (bitte in der glu-Spec nachlesen, siehe Sticky), womit man die Transformation 'rückwärts' ausführen kann (umkerbare Matrizen vorausgesetzt). Damit läßt sich eine 2D-Mauskoordinate in die dazugehörige Gerade durch den dargestellten 3D-Raum umwandeln.

Dann gibt's in GL noch Feedback (ist der Terminus aus der Spec), was wohl auch irgendwie für sowas nutzbar ist. Nur leider habe ich mich damit nie beschäftigt und kann nichts genaueres dazu sagen.

Frank
2002-10-22, 20:44:44
danke ihr beiden

klingt alles aber irgendwie kompliziert. Werde wohl erstmal dann mich durch die Punkte mit TAB klicken und die Tastatur zum verschieben nehmen. Mal sehen wieviel Zeit ich noch hab am Ende.

Nasenbaer
2002-10-23, 15:09:01
Originally posted by Frank
danke ihr beiden

klingt alles aber irgendwie kompliziert. Werde wohl erstmal dann mich durch die Punkte mit TAB klicken und die Tastatur zum verschieben nehmen. Mal sehen wieviel Zeit ich noch hab am Ende.

Ist eigentlich nicht schwer (mit GLUT kenn ich mich net aus) mit Window-Messages.

Du hast ja sicher ne CALLBACK-Funktion für Nachrichten wie z.B. WMQUIT usw.


LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

xPos = LOWORD(lParam); // X-Koordinate des Maus-Cursors
yPos = HIWORD(lParam); // Y-Koordinater der Maus-Cursors


switch(msg)
{
case WM_LBUTTONUP: // Wenn der linke Mousebutton gedrückt und wieder losgelassen wurde
// mach irgendetwas
break;

case WM_RBUTTONDOWN: // Wenn der recht Mousbutton gedrückt wird
// mach was
break;
}


Das wars dann eigentlich.
Um alle Messages, die die Mouse aussendet, zu erhalten Suche in der Hilfe einfach nach einer der oben genannten Messages. :)

Mfg Nasenbaer