ich versuch mir grad 'n objekt zu schreiben, das es auch solchen dummies, wie mich, ermöglicht mal ein OGL auf den Bildschirm zu zaubern, doch leider klappt das noch nicht ganz ...
Aber du machst bei deiner Selektion ein paar Fehler.
Code:
if fSelectNames then//Wenn Selektion aktiv ist
glSelectBuffer(...)
glInitNames(...)
glPushName(...)
gluPickMatrix(...)
gluPerspective(...)
glRenderMode(GL_RENDER); <<< Das da!!!
end;
glMatrixMode(GL_PROJECTION);
glLoadIdentity()
gluPerspective(...)
SwapBuffers(DC);
Das "glRenderMode(GL_RENDER)" ist falsch. Damit verlässt du die Selektion augenblicklich wieder.
Das Neusetzen der Ansicht ist auch falsch, da du dadurch deine für die Selektion eingestellte Ansicht wieder überschreist bzw auf die Darstellungsansicht setzen würdest. Was einer Selektion über den gesammten Bildschirm gleich kommt.
Das "SwapBuffers(DC);" ist auch falsch. Denn wenn du eine normale Selektion hättest würdest du nichts zeichnen und damit würde ein leeres Bild gezeichnet werden.
Korrekt müsste es so aussehen. Kein echter Code sondern eher Pseudocode.
Code:
if fSelectNames then begin
glSelectBuffer(...)
glRenderMode(GL_SELECT)
glInitNames
glPushName(...)
glMatrixMode(GL_PROJECTION)
glPushMatrix
glLoadIdentity
gluPickMatrix(...)
gluPerspective(...)
Objekte Zeichnen
// Ansicht zurücksetzen
glMatrixMode(GL_PROJECTION);
glPopMatrix;
// Selektion verlassen und Hits auswerten
Hits := glRenderMode(GL_RENDER);
...
end;
// Hier noch einmal normal zeichnen
SwapBuffers(DC);
Wobei die Selektion an der Stelle aber genau um ein Bild verzögert wäre. Was im Normalfall aber eher ungüstig ist, denn du würdest erst verspätet darauf reagieren etc. Typischerweise würde ich empfehlen, dass du eine die Selektion nicht direkt beim Rendern erledigst sondern es als extra Methode machst um auf das Ergebniss der Selektion auch reagieren zu können.
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Aus meiner Sicht einfacher und in einem aktuellen Projekt erfolgreich eingesetzt: Selektion per Farbwahl. Du definierst Dir ein Basis-Objekt, dass die Methode "render" enthält. Hier drinne entscheidest Du Dich, ob Du die Welt gerade für den Nutzer oder für den (ich nenns mal) ColorPicker render willst. Alle davon abgeleiten Objekte müssen von dort an zwei Methoden mitbringen. Ich nannte sie immer "renderColorPicker" und "renderNormal". Es kann sich lohnen die Geometry in einer weiteren Methode "renderObject" zu schreiben, die Du in beiden aufrufst. In der Methode darf dann nur Geometry sein, keine Texturierung oder Farbbelegung. Wieso überhaupt zwei Methoden für beide Modi? Würden beide gleich rendern (was bei vielen Objekten geht), würdest Du keine Möglichkeit haben gesonderte Klickbereiche zu haben, z.B. wenn der klickbare Bereich größer sein soll als das Objekt selbst oder Du Dich im renderNormal dafür entscheidest z.B. einen Schattenwurf einzubauen, der allerdings nicht klickbar sein soll.
Von einer globalen Instanz läßt Du Dir einmalige Farbwerte geben und weist diese dann dem Objekten zu. Vor dem Zeichnen des renderColorPick setzt Du diese Farbe. Nun kannst Du bei einem Mausklick in einen ColorPick-Mode gehen, alle deine Objekte ganz normal rendern lassen, bei der aktuellen Mausposition die Farbe auslesen und danach diese bei der globalen Instanz nachschlagen. Dieses Verfahren hat aus meiner Sicht zwei entscheidende Vorteile. Es ist sehr leicht transparent in eigene Anwendungen einzubauen und es erlaubt ein vorzügliches Debugging, da man die Szene einfach im ColorPick-Mode zeichnen kann, um zu sehen, wie die Klickbereiche aussehen und wie sie sich mit der aktuellen Szene überlagern. Das ganze klingt wesentlich komplizierter als es tatsächlich ist, ist für mich allerdings eine echte Alternative in anbetracht der Tatsache, dass es den Selektion-Mode ab OpenGL3 sowieso nicht mehr geben soll.
Die Anzahl der Objekte mit (256^4)-1 sollten auch locker ausreichen und die Szene untexturiert als reine Geometry nochmal zeichnen schafft jede aktuelle Grafikkarte. Zumal dies nur gemacht werden muss, wenn der Anwender einmal geklickt hat. Für einen Hover-Effekte, der vorraussetzt das man bei jeder Mausbewegung die Szene nochmals zeichnet, kann es auf alten Karten zu kleineren Lags kommen. Dafür ist kostet es dann doch ein wenig. Habe ein solches Verfahren gerade in einem Projekt eingesetzt und hat vorzüglich funktioniert und war für den Einsatzbereich auch sehr performant.... und für die Mahte-Idioten wie mich: kommt ohne eine Zeile Mathe aus
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
danke, lossy und Phobeus. hab die ganze selektion herausgenommen...
werd mir mal die color pick geschichte von Phobeus ansehen. kennt jemand 'n kleines code beispiel hierfür? hab nur 3 einträge hier gefunden, die nicht grad was damit zu tun haben...
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.