Hi Leute,
Also keine Angst es hat nichts mit der Realisation der Selection zu tun, das ist ja ausreichend um Tutorial beschrieben.
Meine Frage aber nun:
Sicher jeder, der von Euch 3d Programme irgendwelcher Art schreibt, hat x-verschiedene Anwendungen für Selectionen. Meine Frage jetzt: Wie verwaltet ihr diese Sinnvoll?
Habt ihr eine Art SelectionManager, in dem ihr die Selectionen überprüfen lasst, in dem neue hinzugefügt werden usw?
Könnte mir vorstellen, dass das funktioniert. Mein Problem ist leider, dass ich im Rahmen der Selection meine ganze Szene rendern muss. Wenn ich nun die Selectiion in eine andere externe Datei zb die Selectionmanager.pas, dann kann ich ja kaum meinen Rendervorgang innerhalb der Funktion ausführen. Das ist ein bisschen umständlich. Hat wer ne Idee, was ich da Stattdessen machen kann?
Mir wurde von nem Kollegen, der das ganze beruflich macht folgendes geraten:
Versuch nie, oder so wenig wie nur geht, von der Grafikkarte zu lesen.
Da ich eh Ray->Triangle und Ray-Box collision brauchte hab ich diese benutzt um mein eigenes Picking zu bauen. Zusätzlich zu der reinen Prüfung ob eine Boundingbox oder ein Triangle getroffen wurde brauchte ich noch die Möglichkeit meine Mausposition in ein Ray umzubauen. Anhand der Kameraposition (die ja meine Cameraklasse weiss, ohne GL zu fragen) und den Informationen über die Near und Farplane kann man recht simpel den Screen auf die Beiden Planes mappen. Damit hat man dann den start und den endpunkt des Mausrays.
Nun muss ich nurnoch alle für mich interessanten Objekte überprüfen ob sie getroffen wurden.
Dafür hab ich nen Collisionmanager, bei dem ich meine Objekte für verschiedene Arten von Kollisionen registriere. Der rennt nun durch alle sichtbaren (das noch bissel dreckig, weil basiert nur auf entfernung, hier fehlt bei mir noch die anbindung ans FCulling) Objekte und testet zuerst die Boundingbox. Für das meiste reicht das schon. Will ichs genau wissen, überprüf ich dann nochmal von allen Objekten deren Boundingbox ich getroffen hab die einzelnen Dreicke um mehr zu wissen.
Auf diesem Weg spar ich das doppelte Rendern der Welt und vorallem das lesen von OpenGL.
Hab das ganze dann mal im testcase nebeneinander probiert und hab festgestellt, daß es so wirklich schneller ist (obwohl ich für meine Objekte ne extra drawfunktion fürs picking hatte, die alles weggelassen hat, was zeit kostete (reine vertexdaten)).
Man kann bei glLoadName auch Zeiger und Objekte übergeben indem man sie nach Cardinal oder Integer konvertiert. Dann braucht man keine Liste anzulegen.
Bei vielen Dreiecken macht es aber mehr Sinn, die Nummer die man bei glLoadName übergeben würde als Farbe zu kodieren und dann die Farbe zurückzulesen. Wenn man ein Auswahlrechteck benötigt, muß man eben mehr Pixel lesen. Dann braucht man auch keinen Baum oder ähnliches zur Beschleunigung. Das Rendern über Selection ist zusätzlich auch noch wesentlich langsamer, als wenn man nur die Farbe zeichnet, besonders wenn man VBO's benutzt.
Zur erklärung. Aus der Datei Form1 rufe ich die TEngine auf und da innerhalb der selection ja einmal gerendert werden muss, habe ich die Selection zweigeteilt. Einmal SetSelection (alles vor dem Rendern) und einmal Getselection (alles nach dem Rendern). Das sollte von der Theorie her auch so funktionieren. Mein Problem ist nur, wenn ich nun irgendwo in meine Szene klicke, egal wo, dann bekomme ich immer 2. Generell bekomme ich immer die Zahl, die ich als letzte auf den Namestack gelegt habe. Warum, das frage ich Euch
Von der Graka lesen ist beim Selektieren kein problem, da es ein vergleichsweise seltner Vorgang ist. In vielen Fällen ist eine Selektion über die Farbe am schnellsten. Dazu sollte man ein FBO benutzen welches ein float32 Framebuffer mit einer Größe von einem bis wenigen wenigen Pixel haben. Nun muss man nur noch jeden Vertex in einer anderen Farbe Zeichnen lassen, wobei Float32 23 bit in der Mantisse hat, was bedeutet, dass man bis zu 8 Mio Vertices mit einem Kanal kodieren kann. Besser ist es ein einem Kanal die Vertexnummer in einem Zweiten die Objektnummer zu speichern.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Dann versuch mal die Selektion visuell zu "debuggen", also zu prüfen ob für die Selektion (die man ja nicht sieht) auch alles korrekt gerendert wird. Also ganz einfach die Pickmatrix etwas erweitern (damit man was erkennt), nicht nach GL_SELECT umschalten und dann am Ende Pause machen (Sleep oder besser Tastendruck). Dann sieht man nämlich sehr schnell ob dass was in der Seletkion gerendert wird auch dem entspricht was man dort gerendert haben will.
glmatrixmode(gl_projection);//Wieder in den Projektionsmodus
glPopMatrix;//um unsere alte Matrix wiederherzustel
Engine.DoEnd;
end;
Also wenn ich jetzt an die Stelle klicke, wo vorher die Kugel war, sehe ich nach dem Klick einen ausschnitt der Kugel, der scheinbar sehr nahe an mir dran ist. Ich sehe entweder nur ein Blaue Fläche, die ein Teilstueck meiner Kugel ist, oder eine blaue Flaeche und weisse Linien, wenn ich in die Naehe des Wireframes klicke.
Klicke ich ausserhalb klicke, sehe ich nur meinen schwarzen raum und mein koordinatensystem.
Weiss nicht genau, ob es so funktioniert. Erhöhe ich die PickMatrix scheint das Ziel weiter weg von mir dargestellt zu werden, da bin ich aber nicht sicher. Zumindest weiss ich nicht, ob es so stimmt ^^
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Jetzt siehst du halt ob das was gerendert werd dem entspricht das selektiert werden sollte wenn jemand an diese Stelle klickt. Wenn sich das Bild nicht ändert, egal wo hin du klickst, und die Kugel dann ne ID von 2 hat (die du ja immer zurückbekommst), dann renderst du während der Selektion evtl. einen falschen Bildausschnitt.
Naja es wird ein sehr kleiner Bildausschnitt dann ueber das gesamte Fenster gerendert. So wie du es erklaerst, macht es sinn, denn wenn ich die Pickmatrix auf 100 100 setze, wird der ausschnitt scheinbar weiter weg angezeigt. In wirklichkeit ist ja aber der gesamte ausschnitt von 1 1 auf 100 100 angewachsen. Stimmt also scheinbar alles
Dennoch kommt immernoch ne 3 bei Selektieren also keine Aenderung
Hast du sonst noch eine Idee?
Ich habe mal eine Demo angehängt. Szene wird normal gerendert. Clickt man links, wird die Selektion gerendert, klickt man rechts sieht man wieder die ganze Szene und kann neu linksklicken.
Mitglieder in diesem Forum: 0 Mitglieder und 0 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.