Ich habe eine 2D-Szene (glortho) und Render nur einen Quad der Größe FN*FM mit einer Textur. Jetzt will ich, dass das Bild um den Mauszeiger skaliert wird (wie bei Google-Maps).
Code:
MouseMove: if FPanning and FMouseDown then begin FX:=FX+(X-FXS); FY:=FY-(Y-FYS); end; FXS:=X; FYS:=Y;
Aber irgendwie krieg ich das nicht hin. Muss ja irgendwie den Mittelpunkt mittels gltranslate auf den Mauszeiger setzten und nach dem skalieren wieder die Verschiebung rückgängig machen. Oder so^^. Bitte helft mir )
EDIT: Ops, eigentlich sollte das in Einsteigerfragen.
beim rendern angebe. Aber irgendwie macht das nicht wirklich das, was ich mir vorstellt habe. Also am liebsten wäre mir genau so ein Zooming und Panning wie bei Google Maps.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Möchtest du die Textur auf dem Quad verschieben, oder ist das Quad quasi riesengroß und du verschiebst es vor dem Bildausschnitt? Also, soll sich die Position des Quads ändern, oder die der Textur?
Da du mit OpenGL im 3D raum bist, könntest du dich tatsächlich vor deinem bild so bewegen wie es Google nur simuliert. D.h. du könntest stufenlos zoomen indem du einfach immer näher ans Bild rangehst. Wichtig dabei ist nur, dass du niemals die Kamera wegdrehst - die muss immer senkrecht zum Bild bleiben also z.B. immer entlang der Z Achse, wenn dein Quad in der XY Ebene liegt.
Um die Mausbewegung auf die Szene zu übertragen musst du, wie du es schon angefangen hast, dir die Differenz der Mauspositionen zwischen 2 Renderdurchläufen(!) merken. d.h. wenn du gezeichnet hast, dann musst du den benutzen wert als Ausgangsbasis für die nächste Differenzberechnung nehmen. Sonst "rennt" dein Bild davon, selbst wenn du nur 1px die Mausbewegst.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Danke für die Antwort. Ich will eigentlich nur den Quad verschieben. Dadrauf ist ne Textur "geklebt". Ich Arbeite nur im 2D Raum mit glortho und will eigentlich ein Verschieben und ein Zoomen mit gltranslatef und glscale realisieren.
Der unten stehende Code realisiert nur ein verschieben (FPanning wird beim Drücken der Leertaste true). Da ich im glortho bin sind quasi die unskalierten Model Koordinaten gleich den Fensterkoordinaten (bzw. FYS in negativer Richtung). Was müsste ich denn bei dem unten stehenden Code ergänzen? Sorry, hab zwar schon ein bissel mit OpenGL rumexperimentiert aber eher auf unterem Level
Code:
MouseMove: if FPanning and FMouseDown then begin FX:=FX+(X-FXS); FY:=FY-(Y-FYS); end; FXS:=X; FYS:=Y;
OnMouseWheel: FXZoom:=FXS; FYZoom:=FYS; Scale:=Scale+(Scale+0.1)/10*WheelDelta/100; if Scale<=0 then Scale:=1e-8;
Ich bins nochmal. Mittlerweile bin ich ein wenig verzweifelt, weil ich das Problem nicht gelöst bekomme. Aber eigentlich sollte das doch nicht so schwer sein, einen FNxFM großen Quad mit Hilfe der Maus zu verschieben und reinzuzoomen. Das Problem ist, dass ich keine z-Koordinaten zum Zoomen benutzen kann, sonder glscale.
Das verschieben des Quads war recht einfach
Code:
glTranslatef(FX,FY,0);
, aber bis dato kann ich halt nur um den Nullpunkt zoomen und nicht um den Mauszeiger. Mittels
kann ich um den Mauszeiger skalieren. Allerdings verschiebt sich die Matrix logischerweise mit der Maus ständig mit. Und eine Verschiebung um (FX,FY) ist auch noch nicht enthalten. Weiß jemand Rat?
1. Du schiebst das Koordinatensystem so das der Mauszeiger in der Mitte liegt 2. Du skaliertst 3. Du schiebst wieder zurück. (<= hier hast du vergessen, dass das Koordinatensystem skaliert wurde und du somit die Verschiebung skalieren musst!)
Versuch mal glTranslatef(-FXS*Scale, -FYS*Scale,0);
Jetzt wird die Matrix je nach Scale anders verschoben. FXS und FYS ist ja einfach die Mausposition auf dem Fenster und werden bei jedem MouseMove aktualisiert. So wandert die Matrix ja die ganze Zeit mit dem Mauszeiger. Irgendwie wollte ich hinbekommen, dass wenn FPanning=true (Leertaste gedrückt) die Matrix verschoben wird. Sonst nicht. Und mit dem Mausrad soll um den Mauszeiger skaliert werden. Brauche ich noch mehr Variablen dafür oder so? Ich raffs irgendwie nicht^^
Ich poste jetzt einfach mal das, was ich bisher habe. Man kann jetzt den Quad verschieben und skalieren. Allerdings gibts beim Skalieren noch seltsame Sprünge.
Der Quad geht von (X=0..FN, Y=0..FM). (FXS,FYS) sind die Mauskoordinaten ohne Skalierung und Translation.(PosX,PosY) sind die OpenGL Mauskoordinaten mit Skalierung und Translation. Scale ist die aktuelle Vergrößerung.(FX,FY) ist die Translation. (FXZoom. FYZoom) sollen die Mauskoordinaten sein, um die gezoomt wird (falls ich die überhaupt brauche). Interaktion: Translation über Leertaste + Maustaste, Zoom über Mausrad.
Code:
procedure Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glTranslatef(FX, FY,0); glTranslatef(FXZoom, FYZoom,0); glScalef(Scale,Scale,1); glTranslatef(-FXZoom, -FYZoom,0);
Ich merke mir nun die alte Position unter (FPosXold,FPosYold) und bilde dann die Different zwischen alter und neuer Position (PosX-FPosXold,PosY-FPosYold) und addiere diese zu (FXZoom,FYZoom). Das kommt dem Ganzen schon näher. Aber so richtig funktioniert es immer noch nicht.
Code:
procedure Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glTranslatef(FX, FY,0); glTranslatef(FXZoom, FYZoom,0); glScalef(Scale,Scale,1); glTranslatef(-FXZoom, -FYZoom,0);
procedure MouseMove(Shift: TShiftState; X, Y: Integer); var ztemp : Double; begin inherited; if FPanning and FMouseDown then begin FX:=FX+(X-FXS); FY:=FY+(Height-Y-FYS); end; FXS:=X; FYS:=Height-Y; end;
procedure KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_SPACE then begin FPanning:=true; Cursor:=crHandPoint; end; end;
procedure KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=VK_SPACE then FPanning:=false; Cursor:=crDefault; end;
procedure MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); var ztemp : Double; begin Scale:=Scale+(Scale+0.1)/10*WheelDelta/100; if Scale<=0 then Scale:=1e-8; Handled:=false; FXZoom:=FXZoom+(PosX-FPosXold); FYZoom:=FYZoom+(PosY-FPosYold); end;
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.