Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 11:30

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Um Mauszeigen skalieren
BeitragVerfasst: So Nov 21, 2010 21:36 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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;

Render:
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  glTranslatef(FX,FY,0);
  glScalef(Scale,Scale,1);
  glTranslatef(-FN/2,-FM/2,0);
  glGetDoublev(GL_MODELVIEW_MATRIX, @FmodelMatrix );
  gluUnProject(FXS, Fviewport[3] -FYS, -1, FmodelMatrix, FprojMatrix , Fviewport, @PosX, @PosY, @ztemp);
  glBegin(GL_QUADS);
  glcolor3f(1,1,1);
  glTexCoord2f(0,0);glVertex3f(0,0,-1);
  glTexCoord2f(1,0);glVertex3f(FN,0,-1);
  glTexCoord2f(1,1);glVertex3f(FN,FM,-1);
  glTexCoord2f(0,1);glVertex3f(0,FM,-1);
  glend;


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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Fr Nov 26, 2010 23:41 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Kann mir denn keiner helfen? ;)

Also ich habe das jetzt soweit bekommen, dass ich beim OnMouseWheel die X und Y Position des Mauszeigers unter FXZoom und FYZoom speichere und dann

Code:
  glTranslatef(FXZoom, FYZoom,0);
  glScalef(Scale,Scale,1);
  glTranslatef(-FXZoom,-FYZoom,0);


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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Sa Nov 27, 2010 00:54 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Sa Nov 27, 2010 01:31 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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;


Render:
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  glTranslatef(FX,FY,0);
  glScalef(Scale,Scale,1);
  glTranslatef(-FN/2,-FM/2,0);
  glGetDoublev(GL_MODELVIEW_MATRIX, @FmodelMatrix );
  gluUnProject(FXS, Fviewport[3] -FYS, -1, FmodelMatrix, FprojMatrix , Fviewport, @PosX, @PosY, @ztemp);
  glBegin(GL_QUADS);
  glcolor3f(1,1,1);
  glTexCoord2f(0,0);glVertex3f(0,0,-1);
  glTexCoord2f(1,0);glVertex3f(FN,0,-1);
  glTexCoord2f(1,1);glVertex3f(FN,FM,-1);
  glTexCoord2f(0,1);glVertex3f(0,FM,-1);
  glend;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Mo Nov 29, 2010 12:42 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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
Code:
glTranslatef(FXS, Height-FYS,0);
glScalef(Scale,Scale,1);
glTranslatef(-FXS,FYS-Height,0);

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? :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Mo Nov 29, 2010 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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!)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Mo Nov 29, 2010 13:05 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Das hab ich auch schon ausprobiert.

Code:
  glTranslatef(FXS, FYS,0);
  glScalef(Scale,Scale,1);
  glTranslatef(-FXS/Scale, -FYS/Scale,0);


Aber dann wird der Quad wieder so zurückgeschoben, dass er wieder um (0,0) skaliert wird. Oder mach ich was falsch?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Mo Nov 29, 2010 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Versuch mal glTranslatef(-FXS*Scale, -FYS*Scale,0);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Mo Nov 29, 2010 13:14 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Coolcat hat geschrieben:
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^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Mo Nov 29, 2010 14:03 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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);

  glBegin(GL_QUADS);
  glTexCoord2f(0,0);glVertex3f(0,0,-1);
  glTexCoord2f(1,0);glVertex3f(FN,0,-1);
  glTexCoord2f(1,1);glVertex3f(FN,FM,-1);
  glTexCoord2f(0,1);glVertex3f(0,FM,-1);
  glend;
  SwapBuffers(DC);
end;

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;
  glGetDoublev(GL_MODELVIEW_MATRIX, @FmodelMatrix );
  gluUnProject(FXS, FYS, -1, FmodelMatrix, FprojMatrix , Fviewport, @PosX, @PosY, @ztemp);
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;
  glGetDoublev(GL_MODELVIEW_MATRIX, @FmodelMatrix );
  gluUnProject(FXS, FYS, -1, FmodelMatrix, FprojMatrix , Fviewport, @PosX, @PosY, @ztemp);
  FXZoom:=PosX;
  FYZoom:=PosY;
end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Um Mauszeigen skalieren
BeitragVerfasst: Mo Nov 29, 2010 15:47 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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);

  glBegin(GL_QUADS);
  glTexCoord2f(0,0);glVertex3f(0,0,-1);
  glTexCoord2f(1,0);glVertex3f(FN,0,-1);
  glTexCoord2f(1,1);glVertex3f(FN,FM,-1);
  glTexCoord2f(0,1);glVertex3f(0,FM,-1);
  glend;
  FPosXold:=PosX;
  FPosYold:=PosY;
  glGetDoublev(GL_MODELVIEW_MATRIX, @FmodelMatrix );
  gluUnProject(FXS, FYS, -1, FmodelMatrix, FprojMatrix , Fviewport, @PosX, @PosY, @ztemp);
  SwapBuffers(DC);
end;

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;


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]