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

Aktuelle Zeit: Fr Jul 18, 2025 11:14

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mittelpunkt folgt Maus :)
BeitragVerfasst: Mi Jul 06, 2005 11:13 
Offline
DGL Member

Registriert: Mi Jul 06, 2005 10:43
Beiträge: 4
Hallo,
ich arbeite seit kurzem mit OpenGL und hab nu ein Problem :)

Ich hab ein panel erstellt auf dem ich halt mein OpenGL Zeugs
ausgebe :)

Nu will ich das der Mittelpunkt von OpenGL genau auf der
Mausposition liegt...
Momentan mach ich das mit dem OnMouseMove des panels
jedoch bekomm ich da nie das raus was ich haben will...
ich habe das mehr oder weniger so:

Code:
  1.  glTranslate(xs,ys,0)


wobei xs und ys die x,y Koords von MouseMove sind.
Ich würd jetzt gern wissen wie ich das hinbekomme das
der Mittelpunkt genau auf x,y liegt :)

Ich hoffe man kann verstehen was mein Problem ist :)

MfG, Cu usw. Micha


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 11:25 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Wenn du es mit 2D machst, dann dürfte genau das ausreichen, was du bisher gemacht hast. Da dies aber nicht das Fall ist ;), dann denke ich gluUnProjekt / gluProjekt sollte das Richtige sein.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mittelpunkt folgt Maus :)
BeitragVerfasst: Mi Jul 06, 2005 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Willkommen am Board.

mgapski hat geschrieben:
Ich hoffe man kann verstehen was mein Problem ist :)

Nein. Leider verstehe ich das nicht so genau. Möchtest du mittels 2D etwas darstellen oder möchtest du einem 3D Raum, bei dem sich die Ansicht je nach Mausposition verschiebt? Also eine Art Ballerspiel.

Dafür gibt es leider sehr verschieden Wege weswegen das ein nicht zu unterschätzender Tatbestand ist.

Für den Fall, dass du bereits etwas gemacht hast und das nicht so beschreiben kannst bieten sich bilder und oder Quellcodes immer recht gut an. Ein Bild sagt oftmals mehr als man in einer Beschreibung schreiben kann. Vor allem, da man meistens nicht genau weiß wo der ein oder andere seine Prioritäten setzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 12:42 
Offline
DGL Member

Registriert: Mi Jul 06, 2005 10:43
Beiträge: 4
ok, ich wusste ja das ich das ich mein Problem nicht richtig rüber bringen würde :)

Also noch ein versuch (Code gibts dazu nicht ^_^ )

Ich habe ein panel auf dem ich meine OpenGL Ausgabe habe...
dort zeichne ich mir ein Quad...
es ist alles in 2D und dies wird sich auch net ändern :-)

nun will ich, bei onMouseMove des panels, den
Koordinatenursprung genau dort haben wo grad
meine maus ist :)

das macht man ja mit
Code:
  1. glTranslate(xs,ys,0)

mein problem ist nun, das onMouseMove pixel zurück
gibt... die kann ich leider net einfach in glTranslate
einfügen, da das dann ja Müll ergibt... :cry:

ich hab den Hinweis von sniper_w ma nachverfolgt... komme aber bei dem
komischen gluUnProject nicht wirklich weiter
ich hab auf Wiki nachgelesen, komme aber trotzdem net
dahinter welche Params das ding von mir haben will...

könnte vielleicht jemand ein kleines Bsp. posten wie das geht?
oder gibt´s da noch nen einfacheren Weg?

MfG, Cu usw. Micha


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 12:43 
Offline
DGL Member

Registriert: Mi Jul 06, 2005 10:43
Beiträge: 4
sry 4 doppel Post :oops:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 13:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also für 2D ist das ziemlich einfach. Du hast mit glOrtho eine Größe von deiner Ansicht eingestellt. Wenn du dort die genau Pixelgröße angibst, dann haut es sehr genau hin. Wobei ich das eigentlich immer direkt mit glVertex2i angebe. Und da konnte ich mich so jetzt nicht beschweren. Wenn dir das nicht weiter hilft, dann wirst du keine andere Wahl haben als ein wenig Code rauszurücken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 13:26 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Sollte so gehen:

Code:
  1.  
  2. function GetObjectCoords(_wx, _wy : integer; out _ox,
  3.   _oy, _oz: Double): Boolean;
  4. var
  5.   MV : TGLMatrixd4;    // ModelView
  6.   PM : TGLMatrixd4;    // Projection
  7.   VP : TGLVectori4;    // Viewport
  8.   wz : array of Single;
  9. begin
  10.   wglMakeCurrent(myDC,myRC);
  11.   glMatrixMode(GL_MODELVIEW);
  12.   glPushMatrix();
  13.   glGetDoublev(GL_MODELVIEW_MATRIX,PGLDouble(@MV));
  14.   glPopMatrix();
  15.   glMatrixMode(GL_PROJECTION);
  16.   glPushMatrix();
  17.   glLoadIdentity();
  18.   glGetDoublev(GL_PROJECTION_MATRIX,PGLDouble(@PM));
  19.   glPopMatrix();
  20.   glGetIntegerv(GL_VIEWPORT,PGLInt(@VP));
  21.  
  22.   SetLength(wz,1);
  23.  
  24. // Depth-Komponente für Pixel holen
  25.   glReadPixels(_wx,_wy,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@wz[0]);
  26.  
  27.   Result := Boolean(gluUnProject(_wx,_wy,wz[0],MV,PM,VP,_ox,_oy,_oz));
  28.   wz := nil;
  29. end;
  30.  


und finally
Code:
  1.  
  2. MouseMove(...,X,Y : Integer);
  3. var
  4.   oglx, ogly, oglz : Double;
  5. begin
  6. [...]
  7. // Windows zählt von oben nach unten, OGL von unten nach oben
  8.   if GetObjectCoords(X,Panel.Height-Y,oglx,ogly,oglz) then begin
  9.   [...]
  10.     glTranslatef(oglx,ogly,oglz)
  11.   [...]
  12.   end;
  13. end;
  14.  


Ohne Garantie. Aber so berechne ich mir den Punkt auf den der User geklickt hat, um dann einen Farbtropfen fallen zu lassen. Und es funktioniert eigentlich...

Grüße

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 14:00 
Offline
DGL Member

Registriert: Mi Jul 06, 2005 10:43
Beiträge: 4
@ Lossy eX
das hilft mir leider nicht so wirklich weiter...
ich würd ja gern code posten.. aber wie gesagt:Mehr
als ein Quad zu zeichnen mach ich ja nicht.
Und ich glaub net das es was bringt wenn ich das hier poste... oder?

@ Blechwolf
das schaut ja fast so aus wie das was ich suche ^^
das einzige problem ist:
Zitat:

Undefinierter Bezeichner: 'TGLMatrixd4'
Undefinierter Bezeichner: 'TGLVectori4'


:cry:

ich hab unter uses OpenGl und glaux eingebunden.. kann es sein
das ich ne zu alte OpenGl oder glaux Version habe? :?

MfG, Cu usw. Micha


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 14:10 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ja, was sagen wir immer über Glaux? Sofort vergessen, gibt zahlreiche bessere Varianten um es zu ersetzen *kugel.bitzer.rausholt*
Was die Fehlermeldung angeht, vermutlich sind deine Header zu alt. Es handelt sich hierbei um einen tragischen "Erbfehler", da die meisten OpenGL 1.2 Header Delphi-typisch statt gluint ein TGluInt etc. verwenden. Ist natürlich nicht sinnvoll, wenn es darum geht alten Code zu verwenden, der es nicht kann und man alle Typen umschreiben muss. Entweder definierst Du Dir einen eigenen Typ TGluInt = gluInt etc. oder einfacher: Du verwendest unsere DGL-Header. Die verstehen gleich beide Varianten und sind auf den neusten Stand. FAQ zum Initalisieren nicht vergessen. .... so und nun lese ich gerade, dass diese Typen ja gar nicht zu OpenGL gehören, sondern Du vermutlich doch eher eine Datei namens "Geometry.pas" brauchst, die IMAO von Mike Lischke für GlScene gemacht wurde. Ist diese nicht bei uns in der SDK enthalten (weiß ich wirklich spontan nicht) ;)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 14:11 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
so dürfte es aber gehen:
Code:
  1. type
  2.   TForm1 = class(TForm)
  3.     Panel1: TPanel;
  4.     Timer1: TTimer;
  5.     procedure FormCreate(Sender: TObject);
  6.     procedure FormDestroy(Sender: TObject);
  7.     procedure FormPaint(Sender: TObject);
  8.     procedure FormResize(Sender: TObject);
  9.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  10.       Shift: TShiftState);
  11.     procedure Timer1Timer(Sender: TObject);
  12.     procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  13.       Y: Integer);
  14.   private
  15.     { Private declarations }
  16.   public
  17.     { Public declarations }
  18.     BoxCoords:TPoint;
  19.     myRc, myDc : Cardinal;
  20.     procedure InitGl();
  21.     procedure DeInitGl();
  22.   end;
  23.  
  24. var
  25.   Form1: TForm1;
  26.  
  27. implementation
  28.  
  29. {$R *.dfm}
  30.  
  31. procedure TForm1.InitGl();
  32. begin
  33.  InitOpenGL();
  34.  myDc := GetDC(Panel1.Handle);
  35.  myRc := CreateRenderingContext(myDc,[opDoubleBuffered],24,16,8,0,0,0);
  36.  ActivateRenderingContext(myDc,myRc);
  37.  
  38.  glClearColor(1, 1, 1, 1.0);
  39.  glShadeModel(GL_SMOOTH);
  40.  glClearDepth(1.5);
  41.  glEnable(GL_DEPTH_TEST);
  42.  glDepthFunc (GL_LEQUAL);
  43.  
  44.  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  45. end;
  46.  
  47. procedure TForm1.DeInitGl();
  48. begin
  49.  DeactivateRenderingContext();
  50.  ReleaseDC(Panel1.Handle,myDc);
  51. end;
  52.  
  53. procedure TForm1.FormCreate(Sender: TObject);
  54. begin
  55.  Randomize();
  56.  InitGl();
  57.  BoxCoords := Point( Round(Panel1.Width/2), Round(Panel1.Height/2) );
  58. end;
  59.  
  60. procedure TForm1.FormDestroy(Sender: TObject);
  61. begin
  62.  DeInitGl();
  63. end;
  64.  
  65. procedure DrawRectXY(const x,y:Integer);
  66. begin
  67.  glColor3f(1,0,0);
  68.  glLoadIdentity();
  69.  glTranslatef(x - 5, y - 5,0);
  70.  glScalef(10,10,0);
  71.  glBegin(GL_QUADS);
  72.    glVertex2i(0,0);
  73.    glVertex2i(1,0);
  74.    glVertex2i(1,1);
  75.    glVertex2i(0,1);
  76.  glEnd();
  77. end;
  78.  
  79. procedure TForm1.FormPaint(Sender: TObject);
  80. begin
  81.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);
  82.  // TODO : Draw Hier
  83.   DrawRectXY(BoxCoords.X, BoxCoords.Y);
  84.  // End Drawing
  85.  SwapBuffers(myDc);
  86. end;
  87.  
  88. procedure TForm1.FormResize(Sender: TObject);
  89. begin//
  90.  if (Panel1.Height=0) then Panel1.Height := 1 ;
  91.  
  92.  glViewport(0, 0, Panel1.Width, Panel1.Height);
  93.  glMatrixMode(GL_PROJECTION);
  94.   glLoadIdentity();
  95.   glOrtho(0, Panel1.Width, 0 , Panel1.Height, -10,10);
  96.  glMatrixMode(GL_MODELVIEW);
  97.   glLoadIdentity();
  98.  
  99.  FormPaint(Self);
  100. end;
  101.  
  102. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  103.   Shift: TShiftState);
  104. begin
  105.  if Key=27 then Close();
  106. end;
  107.  
  108. procedure TForm1.Timer1Timer(Sender: TObject);
  109. begin
  110.   FormResize(nil);
  111. end;
  112.  
  113. procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  114.   Y: Integer);
  115. begin
  116.  BoxCoords := Point(X, Panel1.Height - y);
  117.  FormResize(nil);
  118. end;

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 14:24 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
mgapski hat geschrieben:
Undefinierter Bezeichner: 'TGLMatrixd4'
Undefinierter Bezeichner: 'TGLVectori4'


Bin davon ausgegangen, das Du die dglOpenGL.pas benutzt. Der OpenGL.pas Header von Delphi ist nämlich leider hoffnungslos veraltet und nicht wirklich vollständig.

Grüße

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 14:33 
Offline
DGL Member

Registriert: Mi Jul 06, 2005 10:43
Beiträge: 4
hey, jetzt gehts :o ... fast :cry:

ich bekomm noch bei
Code:
  1.   Result := Boolean(gluUnProject(_wx,_wy,wz[0],MV,PM,VP,_ox,_oy,_oz));


die Meldung:
Zitat:
Inkompatible Typen: 'TGLMatrixd4' und 'PGLdouble'


MfG, Cu usw. Micha


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
mgapski hat geschrieben:
@ Lossy eX
das hilft mir leider nicht so wirklich weiter...
ich würd ja gern code posten.. aber wie gesagt:Mehr
als ein Quad zu zeichnen mach ich ja nicht.
Und ich glaub net das es was bringt wenn ich das hier poste... oder?

So würde ich das nicht sehen. Du musst ja außer dem weißen Quad noch etwas machen sonst würdest du ja nicht mal das sehen und das scheint ja nicht so gehen wie du willst. Sonst hättest du ja auch keine Frage gestellt. Und da es nun mal zig Möglichkeiten gibt etwas zu lösen erlangen wir nur mit Code den vollen Durchblick. (Meistens) ;-)

Aber an deiner Stellen würde ich mir mal den Code von Sniper genau anschauen. Er sollte das machen was du haben willst.

@gluUnProjekt: Versteht mich nicht falsch. Aber was soll das bei dem Problem helfen? Er arbeitet doch in 2D wenn ich das richtig verstanden habe. Und dann ist es doch nur ein Positionierungsproblem

@Blechwolf, Sniper und glOrtho: Wer auch immer damit angefangen hat alles auf den Kopf zu stellen. Es geht auch einfacher. ;-) Du kannst bei glOrtho die Dimensionen auch so angeben, dass sie richtig herum stehen. Um mal das Wiki zu zitieren.
Zitat:
glOrtho(left, right, bottom, top, znear, zfar : double);


Wenn man also folgendes macht sind die Koordinaten like Windows. Ursprung oben links.
Code:
  1. glOrtho(0, glPanel.Width, glPanel.Height, 0, -1, 1);

Das ist aber im Endeffket auch nur eine Schönheitssache für den Entwickler. OpenGL ist das mal so etwas von egal wie rum man das spiegelt und skaliert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 15:35 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Wenn man also folgendes macht sind die Koordinaten like Windows. Ursprung oben links.

Toller Tipp, danke.
:wink:

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 06, 2005 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
*lol* einfach spiegeln das is SCHMUUHHHH^^ ;-)

im ernst: sauberer ist es(finde ich zumindest) die Mauskoordinaten sauber in OpenGL-WC-Koordinaten umzurechnen.
Solche Spielchen mit dem Spiegeln machen den Code undurchsichtig.

MfG Pellaeon

P.S.: WC = World Coordinates und net das Klo :P


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 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.016s | 15 Queries | GZIP : On ]