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

Aktuelle Zeit: Sa Jul 19, 2025 23:36

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



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 16, 2003 10:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Deklariere Viewport mal folgendermassen :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>Viewport : <span class='reserved'>array</span>[<span class='integer'>0</span>..<span class='integer'>3</span>] <span class='reserved'>of</span> Integer;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Ausserdem muss du statt
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>gluPickMatrix(x,y,<span class='integer'>4</span>,<span class='integer'>4</span>,viewport);</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
folgendes an gluPickMatrix übergeben :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>gluPickMatrix(x, viewport[<span class='integer'>3</span>]-y, <span class='integer'>4</span>, <span class='integer'>4</span>, Viewport);</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 16, 2003 15:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Versuch es mach mit einem @ vor dem Viewport. Damit übergibt er dann nur den Pointer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 16, 2003 19:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Schau mal auf meiner Homepage vorbei (URL siehe SIG), dort hab ich ein Delphi-Tutorial zum Thema Selektion gepostet, welches die OpenGL1.2-Unit nutzt...

P.S. : Verändere doch auch mal die gluPickMatrix-Parameter, denn die die du übergist sind nicht korrekt...wie ich schon gepostet hab muss es so aussehen :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>gluPickMatrix(x, viewport[<span class='integer'>3</span>]-y, <span class='integer'>4</span>, <span class='integer'>4</span>, ...</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 17, 2003 13:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Alzheimer hat geschrieben:
Ich habe zu guterletzt nur noch eine Frage : Angenommen man möchte ein "Paint" - Programm erstellen und wäre gezwungen, Koordinaten der Maus über den Viewport umzurechnen ... wie würde man da am besten vorgehen ? (Sorry, wenn ich schon wieder nerve, aber die Neugier ist ungezügelt  :D )

Über Selektion kannst du sowas wie Paint nicht machen, da du ja nur die IDs eines bestimmten Objektes zurückbekommst, und wenn du ins Leere klickst, dann gibts auch keinen Rückgabewert und keine Positionsangabe.

Sowas wie Paint macht man deshalb am besten im orthogonalen Modus, in den man über glOrtho wechselt.Dort hast du quasi nur ne 2D-Projektion (die Z-Koordinate wird dann nur zum sortieren der Objekte genutzt).
Und da du über glOrtho die Dimensionen für deinen Viewport selbst angeben kannst (z.B. glOrtho(0, 1024, 768,0)) ists dann sehr einfach die Mauskoordinaten anhand der Fensterdimensionen in Viewportkoordinaten umzuwandeln.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 17, 2003 18:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Die Thematik ist viel zu primitiv als das sich daraus genug Stoff für ein richtiges Tut (es sei denn man würde das mit z.B. ner GUI verbinden) machen lassen würde, weshalb ich in dieser Richrung nix kenne.

In unserem ForenFAQ steht allerdings drin, wie man in diese Ansicht wechselt : <a href='http://www.phobeus.de/hosting/dgl/forum/index.php?act=ST&f=9&t=846' target='_blank'>http://www.phobeus.de/hosting/dgl/forum/in...ct=ST&f=9&t=846</a>

Ausserdem wirst du im RedBook (siehe Downloads) fündig.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 18, 2003 14:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich konnte bei meinen Implementation der OpenGL-Selektion keine Probleme feststellen, und zwar unabhängig der genutzten Z-Reichweite.In meinem Editor für meine ZornGL-Engine nutze ich diese Methode um Wände und Objekte zu selektieren, und hab damit absolut keine Probleme.Egal ob das Objekt sehr nahe am Betrachter liegt, oder sehr sehr weit wegliegt.Dabei hab ich alles zwischen Z=0.1 und Z=512 one Probleme selektieren können.

Ich seh auch keinen Grund, warum gluPickMatrix z-abhängig sein sollte und entsprechende Probleme machen sollte.Auf welcher Z-Reichweite operierst du denn?Evtl. bringst was den Selektionsradius (4,4) zu verkleinern (evtl. auf 1,1) um die Trefferwahrscheinlichkeit zu erhöhen.
Stell auch sicher, das du in deinem Rendercode nicht irgendwo die Projektionsmatrix mittendrin veränderst, und so evtl. Probleme verursachst.

P.S. : Anmelden tut nicht (oder nur selten :D ) weh, und ausserdem bekommst du dann ne nette E-Mail falls jemand auf dein Thema antwortet.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 19, 2003 19:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Im Moment komme ich leider nicht drauf, woran´s liegen könnte ... aber ich wurschtel einfach mal weiter ... ist bestimmt wieder so ne verflixte Kleinigkeit :P

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 19, 2003 19:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Ich hab rausgefunden, dass die Projektionsmatrix in der Funktion Setup_Viewport aufgerufen wird. Das ganze sieht im Moment so aus :

Deine Selection - Funktion :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>function</span> TForm1.GetSelectionBufferHit : Integer;
<span class='reserved'>var</span>
SelectBuffer : <span class='reserved'>array</span>[<span class='integer'>0</span>..<span class='integer'>512</span>] <span class='reserved'>of</span> TGLUint;
Viewport: TVector4i;
Hits,i: Integer;
HitZValue, Hit: TGLUInt;
<span class='reserved'>begin</span>
ActivateRenderingContext(v1dc, rc1);
glGetIntegerv(GL_VIEWPORT, @Viewport);
glSelectBuffer(<span class='integer'>512</span>,@selectBuffer);
glRenderMode(GL_SELECT);
glInitNames; //Namestack löschen
glPushName(<span class='integer'>0</span>); //Namestack löschen
glMatrixMode(GL_PROJECTION);
glPushmatrix;
glLoadIdentity;
gluPickMatrix(mx,viewport[<span class='integer'>3</span>]-my,<span class='integer'>0.1</span>,<span class='integer'>0.1</span>,viewport);
gluPerspective(<span class='integer'>45.0</span>,Panel1.ClientWidth/panel1.ClientHeight,<span class='integer'>0.1</span>,<span class='integer'>1000</span>);
Renderung(Optionen.Gitter); //Szene einmal rendern
glMatrixMode(GL_PROJECTION);
glPopMatrix;
Hits:=glRenderMode(GL_RENDER); //Treffer ?
DeactivateRenderingContext;
Hit := High(TGLUint);
HitZValue:= High(TGLUInt);
<span class='reserved'>for</span> i:=<span class='integer'>0</span> <span class='reserved'>to</span> Hits -<span class='integer'>1</span> <span class='reserved'>do</span>
<span class='reserved'>if</span> SelectBuffer[(i*<span class='integer'>4</span>)+<span class='integer'>1</span>] < HitZValue <span class='reserved'>then</span>
<span class='reserved'>begin</span>
Hit := SelectBuffer[(i*<span class='integer'>4</span>)+<span class='integer'>3</span>];
HitZValue := SelectBuffer[(i*<span class='integer'>4</span>)+<span class='integer'>1</span>];
<span class='reserved'>end</span>;
form1.Frame1.Label1.caption:='Hits : '+inttostr(Hits);
//form1.Label2.caption:='Hit : '+inttostr(Hit);
form1.Frame1.Label3.Caption:='HitZValue : '+inttostr(HitZValue);
Result:=Hit;
SetupViewport(v1DC,RC1,Panel1.Width,Panel1.Height);
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Wie du hier siehst, steht an letzter Stelle die Funktion <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>SetupViewport(v1DC,RC1,Panel1.Width,Panel1.Height);</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Ohne diese Funktion bleibt nach dem ersten Mausklick der Viewport schwarz. Die Funktion SetupViewport sieht so aus :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>procedure</span> TForm1.SetupViewport(dc:HDC; rc:HGLRC; width,height:Integer);
<span class='reserved'>begin</span>;
// Aktivieren des RC
wglMakeCurrent(dc, rc);

// Standard OpenGL Einstellung
glClearColor(<span class='integer'>0.0</span>, <span class='integer'>0.0</span>, <span class='integer'>0.0</span>, <span class='integer'>0.0</span>); //Hintergrundfarbe
glEnable(GL_DEPTH_TEST); //Tiefenpuffer aktivieren
glEnable(GL_CULL_FACE); //Backface Culling aktivieren
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);

// Anpassen des Viewpors und seiner Projektions-Matrix
glViewport(<span class='integer'>0</span>, <span class='integer'>0</span>, Width,Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//Perspektivische Darstellung
gluPerspective(<span class='integer'>60.0</span>,Width/Height,NearClipping,FarClipping);// Calculate The Aspect Ratio <span class='reserved'>Of</span> The Window
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Also meiner Vermutung nach resultiert die gravierende Ungenauigkeit aus dem Aufruf der Prozedur SetupViewport am Ende der Funktion GetSelectionBufferHit. Nur ohne den Aufruf wird wie gesagt mein Viewer schwarz ... nur kenn ich da leider keinen Ausweg aus der Misere ... :unsure:

Bis zu einer Entfernung von z -2 bleibt die Ungenauigkeit noch so in Grenzen, dass man wenigstens was auswählen kann. Darüber ist es vorbei ...
Ich hab Dir den Source wieder <a href='http://www.onkeltortysfiles.de/selection.zip' target='_blank'>hier</a> hochgeladen ...

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 19, 2003 20:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hm...hab jetzt grade nicht die Motivation mich damit auseinanderzusetzen und hab deshalb nur mal kurz drübergekuckt, aber ändere mal deinen Selektionscode zum Test folgendermaßen :

<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>function</span> TForm1.GetSelectionBufferHit : Integer;
<span class='reserved'>var</span>
SelectBuffer : <span class='reserved'>array</span>[<span class='integer'>0</span>..<span class='integer'>512</span>] <span class='reserved'>of</span> TGLUint;
Viewport: TVector4i;
Hits,i: Integer;
HitZValue, Hit: TGLUInt;
faktor_x, faktor_y: single;
<span class='reserved'>begin</span>
faktor_y:=<span class='integer'>0</span>;
faktor_x:=<span class='integer'>0</span>;

ActivateRenderingContext(v1dc, rc1);
glGetIntegerv(GL_VIEWPORT, @Viewport);
glSelectBuffer(<span class='integer'>512</span>,@selectBuffer);
//glRenderMode(GL_SELECT);
glInitNames; //Namestack löschen
glPushName(<span class='integer'>0</span>); //Namestack löschen
glMatrixMode(GL_PROJECTION);
glPushmatrix;
glLoadIdentity;
gluPickMatrix(mx,viewport[<span class='integer'>3</span>]-my,<span class='integer'>10</span>,<span class='integer'>10</span>,viewport);
gluPerspective(<span class='integer'>45.0</span>,Panel1.ClientWidth/panel1.ClientHeight,<span class='integer'>1</span>,<span class='integer'>256</span>);
Renderung(Optionen.Gitter); //Szene einmal rendern
glMatrixMode(GL_PROJECTION);
glPopMatrix;
Hits:=glRenderMode(GL_RENDER); //Treffer ?
SwapBuffers(v1dc);
sleep(<span class='integer'>500</span>);
DeactivateRenderingContext;
Hit := High(TGLUint);
HitZValue:= High(TGLUInt);
<span class='reserved'>for</span> i:=<span class='integer'>0</span> <span class='reserved'>to</span> Hits -<span class='integer'>1</span> <span class='reserved'>do</span>
<span class='reserved'>if</span> SelectBuffer[(i*<span class='integer'>4</span>)+<span class='integer'>1</span>] < HitZValue <span class='reserved'>then</span>
<span class='reserved'>begin</span>
Hit := SelectBuffer[(i*<span class='integer'>4</span>)+<span class='integer'>3</span>];
HitZValue := SelectBuffer[(i*<span class='integer'>4</span>)+<span class='integer'>1</span>];
<span class='reserved'>end</span>;
form1.Frame1.Label1.caption:='Hits : '+inttostr(Hits);
//form1.Label2.caption:='Hit : '+inttostr(Hit);
form1.Frame1.Label3.Caption:='HitZValue : '+inttostr(HitZValue);
Result:=Hit;
SetupViewport(v1DC,RC1,Panel1.Width,Panel1.Height);
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Damit wird zwar nix selektiert, aber du siehst für ne halbe Sekunde lang den Ausschnitt den du angeklickt hast, und kannst so einfacher feststellen was schief läuft.Ausserdem hab ich die Nearclippingplane auf 1 hochsetzen müssen, da es sonst Probleme gibt.
Geh auch sicher, das deine Mauskoordinaten stimmen!Die müssen ja relativ zu deiner oberen linken Ecke des Viewports sein!

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]