ich habe mehr oder weniger das Tut von www.delphigl.de zur Objektselektion genutzt.
Auf meinem Rechner funzt das auch wunderbar. Nun tritt auf anderen Rechnern aber ein komisches Verhalten auf. Entweder kommt nen Fehler mit Zugriff auf eine Adresse 0 oder das Programm schmiert ganz ab und schließt sich einfach.
Kann es sein, dass da ein Treiberproblem auftaucht. Welche OpenGL-Version ist denn notwendig für den SELECT-Modus?
Anbei noch der Code:
Code:
// Aufbau: [id][z-wert]
type SelectArray =array[0..511]ofarray[0..1]ofcardinal;
.
.
.
function TGeoDataBase.getSelectedObj(x,y :integer;pixels :double;
Eine zweite Frage hätt ich noch zum select-Buffer. Der geht ja von 0-512, also 513 integer groß, als Größenangabe im Code steht 512. Soll das so sein(ist übernommen ausm Tut)?
Die Unit wurde auch auf dem entsprechendem Rechner in einem anderen Testprogramm genutzt und kompiliert. Derselbe Fehler, aber bei mir funzt die exe wunderbar.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hi,
die Selektion ist Grundbestandteil von OpenGL. Also das ist seit der ersten Version verfügbar und hat sich seitdem nicht verändert.
Mit dem Buffer hast du recht. Der ist 1 Element zu groß definiert. Also normal sollte der wohl als [0 .. 511] definiert sein. Aber das ist nicht so tragisch. Andersrum wäre es kritischer.
Ich finde die Selektion so ein wenig ungewöhnlich aufgebaut aber, da es auf dem einen Rechner ja funktioniert denke ich mal, dass das Problem eher woanders liegen wird. Zur Not probier mal andere Selektionprogramme aus. Oder wenn du die Möglichkeit hast es dort zu debuggen dann solltest du sie nutzen. Wenn nicht, dann würde ich massive Logausgaben durchführen um die entsprechende Codestelle ausfindig zu machen.
Sonst finde ich so nichts offensichtliches. Habe aber auch meine Kaffee gerade noch neben mir stehen.
Ich finde die Selektion so ein wenig ungewöhnlich aufgebaut
Inwieweit meinst du das? Für Verbesserungsvorschläge bin ich immer offenn. Wie gesagtr habe das halbwegs ausm Tut übernommen und nur meine Objekte reingepackt.
Das alle selektierten Objekte zurück gegeben werden ist Absicht, die werden "außerhalb" noch nach gewissen Kriterien durchforstet. Die hängen aber mehr mit Objektbeziehungen zusammen und deshalb habe ich die aus dem allgemeinen Picken rausgenommen.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Na ja. Wird wohl eher auch nur gemacht weil man dadurch Fehler vermeiden kann. Also ich kenne es so, dass man eine Renderprocedur hat wärend der Selektion auch nur wieder die RenderProcedur aufruft. Somit hat man die Zeichnerei nur ein mal. Wenn du so halt etwas veränderst dann überträgt sich das auch direkt gleich mit auf die Selektion.
Und das Multiplizieren der Projektsmatrix kommt mir so auch ein bisschen Komisch vor.
Na ja. Wird wohl eher auch nur gemacht weil man dadurch Fehler vermeiden kann. Also ich kenne es so, dass man eine Renderprocedur hat wärend der Selektion auch nur wieder die RenderProcedur aufruft. Somit hat man die Zeichnerei nur ein mal. Wenn du so halt etwas veränderst dann überträgt sich das auch direkt gleich mit auf die Selektion.
Und das Multiplizieren der Projektsmatrix kommt mir so auch ein bisschen Komisch vor.
So ne Rendermethode gibts in der Klasse, aber ich muss doch vor jedem Objekt noch das glLoadName aufrufen, was ja in der normalen Rendermethode nicht mit drinne steht.
Mit der Matrix das ist so: für das Picken wird doch die Projektionsmatrix mit benötigt. Im Tut wird einfach gluPerspective aufgerufen, Bei mir kann es aber auch orthogonal sein. Daher hole ich einfach die aktuell gesetzte Proj.-Matrix und nutze diese. (das Tut ist übrigens von Sascha hier ausm Forum)
Kann es evtl noch sein, dass das SELECT die Bitmapschriften aus OpenGL nicht verträgt?
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Kannst ja bei der Selektion nen Flag setzen, das dann beim Zeichnen geprüft wird, und nur wenns gesetzt ist, wird der Name geladen. Allerdings stört es auch nicht, wenn Du die Namen immer auf den Stack lädst.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wie Sidorion auch gesagt hat. Es stört nicht, wenn du LoadNames mit in der normalen Rendermethode drin hast. Genau so stört beim Selektieren die Texturen etc nicht. Diese werden da dann von OpenGL Deaktiviert.
BitmapSchrift: Das sollte im normalen nicht stören. Kannst es aber auch mal testweise rauslassen. Stören tut es nur dann, wenn du für die Schriften den in den OrthoModus wechselst. Dann zerhaut es dir die PickMatrix. Aber schau dir mal den mittleren Quellcode in dem Selektion Artike an. So kannst du zu Beispiel auch eine RenderMethode schreiben die durchaus ihre Unterschiede in der Verarbeitung hat. Siehe Variable RenderMode.
Projektion: Okay. Das MultMatrix müsste eigentlich den gleichen Effekt haben wie es mit gluPerpective der Fall wäre. Hatte da was falsch in Erinnerung.
Mitglieder in diesem Forum: 0 Mitglieder und 3 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.