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-->
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 )
Ü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.
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.
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 ) weh, und ausserdem bekommst du dann ne nette E-Mail falls jemand auf dein Thema antwortet.
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
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);
// 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 ...
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 :
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!
Mitglieder in diesem Forum: 0 Mitglieder und 12 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.