Zuerst mal ne etwas allgemeinere Frage - warum heißt es in Zeile 31 "getroffen := Puffer[(i*4)+3];"?
Für mich wäre "getroffen := Puffer[(i*4)+1];" logisch. Aber "Puffer[(i*4)+3]"?
Nächste Frage: Im Ortho-Modus macht mir die Selection ein paar Probleme. Wenn ich mein Programm im Fenster laufen lasse, kann ich die Selection komplett vergessen.
Im Fenstermodus(roter "Kreis" gibt Postition vom Mauszeiger an):
Im Vollbildmodus ist es besser, aber auch nicht unbedingt das gelbe vom Ei(rot wieder Mauszeigerposition):
Kann ich das irgendwie verbessern? Ich hab schon versucht am Rechteck, das um den Mauszeiger entsteht und ausgewertet wird rumzuspielen - allerdings hatte ich dabei leider keinen großen Erfolg.
Und meine letzte Frage: Wie kann ich eigentlich Objekte selektieren, die einen bestimmten Z-Wert haben?
Also ich habe mehrere Objekte hintereinander, die allesamt selektierbar sind und ich möchte das selektieren, dessen
Z-Wert beispielsweise 2 ist...
Ich hab schon versucht an diesem Teil des Selection-Codes rumzuspielen
Code:
Z_Wert :=High(GLUInt);//Höchsten Z - Wert
for i :=0to Treffer-1do
if Puffer[(i*4)+1] < Z_Wert then
begin
getroffen := Puffer[(i*4)+3];
Z_Wert := Puffer[(i*4)+1];
end;
, hatte dabei aber keinen großen Erfolg - entweder startete es gar nicht, oder die Selection hat nicht funktioniert...
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Standardantowrt für die Fehlerhafte Selektion ist: Vermutlich hast du verschiedene Perspektiven oder Viewports beim Rendern und bei der Selektion. Guck mal nach, ob die bei beiden Renderdurchläufen gleich sind.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Also, Perspektive ist beide mal glOrtho(0, 640, 0, 480, 0, 128).
Den Viewport, der beim Form.Resize gesetzt wird, ist glViewport(0, 0, ClientWidth, ClientHeight).
Zum Viewport bei der Selection - evntl. hab ich ja Tomaten auf den Augen, oder steh grad ganz fett aufm Schlauch, aber da wird bei mir kein Viewport gesetzt...
ich speicher ihn zwar(Zeile 10. "glGetIntegerv(GL_VIEWPORT, @viewport);" ) und benutze diese Variable nochma bei Zeile 17("gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);", aber ich setz keinen...
Tippe aber darauf das du was anderes gemeint hast und ich einfach nur aufm Schlauch steh...
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
i0n0s hat geschrieben:
Wenn ich es richtig verstanden habe geht Selection nicht im Orthomodus.
Naja, im Wiki ist ja extra ein Beispiel für eine Selection im Orthomodus... Außerdem findet man per Forensuche auch ein bisschen was zu dem Thema - nur leider hab ich bisher nix gefunden was mich weiter gebracht hat...
i0n0s hat geschrieben:
Der Sinn ist auch zu hinterfragen.
Ich tipp mal das du damit darauf anspielst das man auch die Mauskoordinaten ganz normal abfragen kann.
Stimmt schon. Andererseits ist es imho einfacher das mit Selection zu machen, insbesondere für den Fall der Fälle das man andere Objekte als Rechtecke selektieren muss.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Wenn ich es richtig verstanden habe geht Selection nicht im Orthomodus.
Also die Selketion geht 100%tig im Orthomodus. Das was man nicht machen darf ist wärend der Selektion die ansicht zu wechseln. Also weder von Perspektive auf Ortho oder andersrum. Auch wenn es in der Selection auch so ist. Dadurch zerschießt man sich das irgendwie. Meine ich jedenfalls festgestellt zu haben.
Zitat:
Naja, im Wiki ist ja extra ein Beispiel für eine Selection im Orthomodus... Außerdem findet man per Forensuche auch ein bisschen was zu dem Thema - nur leider hab ich bisher nix gefunden was mich weiter gebracht hat...
Hmmmm.
Den Code auf den du anspielst, der funktioniert 100%tig. Habe ich selber gemacht und wenn er nicht verändert wurde, dann funktioniert er noch heute. *hmmm* *märchenstunden*
Ich würde dir sonst empfehlem mal Zeile für Zeile es so zu machen wie es im Wiki ist. Wenn nicht wäre dein Rendercode in der Tat mal interessant. Sonst sieht deine Selection recht normal aus.
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Na dann poste ich lieber erstma den Render Code, bevor ich meine Selection ändere(ich bevorzuge es zu wissen was ich falsch gemacht hab). Wenn das nix hilft, dann probier ich den Wiki-Code aus...
Code:
procedure TForm1.Render;
var
OpenGLID:Integer;
i, j:Integer;
begin
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Jup, steht...
bei Form.Resize:
Code:
procedure TForm1.FormResize(Sender:TObject);
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glViewport(0,0, ClientWidth, ClientHeight);
glOrtho(0,640,0,480,0,128);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
IdleHandler(Sender, Done);
end;
Sorry im übrigen das ich das erst jetzt poste - hätte ich eigentlich auch gleich drauf kommen können, das nicht nur der Render Code den Fehler enthalten kann...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Bis auf das Push und Pop Matrix bei der Selection und dem SwapBuffers was normal nicht ausgeführt wird stimmt alles mit dem überein was im Wiki auch ist. Muss also so spontan passen oder ich hab was übersehen.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
mehrere Sachen die mir aufgefallen sind,vielleicht auch ein paar Sachen die deine ersten Fragen beantworten :
du setzt glOrtho(0, 640, 0, 480, 0, 128);
deine Vertexe haben aber alle einen Z-Wert von -2, dass heisst die befinden sich alle außerhalb des Ortho-Quaders!
Außerdem kann man nicht erwarten, dass im Puffer nur 4 Werte pro Treffer stehen, denn im Selection-Puffer stehen für jeden Treffer folgende Werte (sogenannter 'Hit-Record'):
Anzahl der Namen auf dem name-Stack pro Hit,
z1 : minimaler Z-Wert,
z2 : maximaler Z-Wert,
1. Name (unterstes Element auf dem Stack),
2. Name usw.
...
man müsste also ersteinmal den ersten Wert lesen und dann abhängig davon die nächsten Parameter (nicht in einer for-Schleife sondern am besten einen eigenen Zähler benutzen).
Ich denke jetzt ist auch ersichtlich, warum
getroffen := Puffer[(i*4)+3];
nicht ganz korrekt sein kann, denn es müssen nicht immer Namen auf dem Name-Stack liegen.
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
*augen reib*
*kopfschüttel*
*wunder weil die Schrift nit vom Bildschirm verschwindet*
Uff, ok, ganz langsam, das könnte zu viel für mein armes kleines Hirn gewesen sein...
Zitat:
du setzt glOrtho(0, 640, 0, 480, 0, 128); deine Vertexe haben aber alle einen Z-Wert von -2, dass heisst die befinden sich alle außerhalb des Ortho-Quaders!
Stimmt... Wenn meine Vertizes(is das der Plural von Vertex? Ach, egal...) nen Wert in dem Ortho-Quader haben, dann krieg ich nix mehr angezeigt bzw. dann werden die Quads nicht mehr gezeichnet und ich stehe vor einer tiefen Schwärze...
edit: haut mich... bitte bitte bitte, haut mich ganz ganz doll... für das was ich da eben geschrieben hab gehöre ich echt geschlagen... da hab ich doch allen ernstes mein glTranslatef vergessen und wunder mich warum ich bei positiven Z-Werten nix seh... hab ich jetzt allerdings verändert und es hat keine veränderung mit sich gebracht.
Zitat:
Außerdem kann man nicht erwarten, dass im Puffer nur 4 Werte pro Treffer stehen, denn im Selection-Puffer stehen für jeden Treffer folgende Werte (sogenannter 'Hit-Record'):
Anzahl der Namen auf dem name-Stack pro Hit, z1 : minimaler Z-Wert, z2 : maximaler Z-Wert, 1. Name (unterstes Element auf dem Stack), 2. Name usw. ...
Ok, damit zerstörst du so ganz nebenbei mein Weltbild...
Ich hab ursprünglich im Tutorial hier im Wiki gelernt das immer 4 Werte gespeichert werden. 1. Anzahl der Namen auf dem Stack 2. Kleinster Z-Wert des getroffenen Objektes 3. Größter Z-Wert des getroffenen Objektes 4. Name des Objektes Das da auf einmal mehr als 4 Werte stehen, davon war nirgends die Rede...
Aber zurück zu deinem Text. Ich verstehe das "Name usw." nicht. Der Rest ist ja gleich dem Tutorial, aber wo kommt auf einmal der zusätzliche Name her? Ich mein, das ist ja genau das was du angesprochen hast, aber ich versteh nicht so ganz wo der herkommt bzw. was das jetzt für ein Wert ist.
by the way: Die Frage die ich oben als allererstes gestellt hab, hat sich damit auch erledigt. Naja, zumindest das hab ich dann verstanden *augen verdreh*
Zitat:
man müsste also ersteinmal den ersten Wert lesen und dann abhängig davon die nächsten Parameter (nicht in einer for-Schleife sondern am besten einen eigenen Zähler benutzen).
Ich denke jetzt ist auch ersichtlich, warum
getroffen := Puffer[(i*4)+3];
nicht ganz korrekt sein kann, denn es müssen nicht immer Namen auf dem Name-Stack liegen.
Ok, das wäre die logische Schlussfolgerung davon das auch mehr als nur 4 Werte gespeichert werden können. Wenn mehr gespeichert wurden, dann nicht alle Werte die sich im Puffer[(i*4)+3] befinden die Namen, sondern können auch was anderes darstellen können...
Falls ich damit allerdings versuche zu erklären warum meine Selection so ungenau ist, dann scheitert es an folgenden Fragen:
1. Warum treten diese Probleme anscheinend nur im Ortho-Modus auf?
2. Warum sind im FensterModus die Ergebnisse der Selektion so komisch, während es im Vollbildmodus ja zumindest einigermaßen funktioniert8ist halt ungenau)?
cya
Deathball
Zuletzt geändert von Deathball am Mi Jan 04, 2006 13:31, insgesamt 1-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Deathball: Ich habe gerade, angeregt von dem was dj3hut1 gesagt hat, deinen Code mal angesehen und ich denke es könnte daran liegen, dass du bei die zwar eine glPushName aufrufst aber nirgenswo ein glPopName zu finden ist. Damit packst du immer einen Namen mehr auf den Stack. Ich denke mal, wenn du ähnlich wie in dem Wiki Artikel zu Selection den Fehlercode abfragst und diesen auswertest wirst du "Stack Overflow" bekommen. Also die Meldung, dass dein Stack übergelaufen ist.
dj3hut1: So am nächsten Morgen drüber nachgedacht ist deine Überlegung schon richtig aber ich denke nicht, dass das hierfür eine groß Rolle spielt. Klar. So betrachtet sind die Samples alle irgendwie falsch oder besser nicht ganz richtig.
Als Hintergrundwissen für alle Interessierten. Man hat in OpenGL einen NameStack. Ähnlich wie der für die Matrizen nur das dort Namen zu finden sind. Damit kann man zum Beispiel auch Gruppierungen durchführen. Klassisches Beispiel. Man hat ein Auto mit jeweils 4 Reifen. Vorne Links ist die 1 und Vorne Rechts ist die 2. Wenn man jetzt 20 Autos hätte hätte man auch 20 Reifen die vorne links sind. Zu dem Zweck kann man noch eine ID des Fahrzeugs auf den Stack packen. So hätte man dann ID 1 und ID 1 auf dem Stack. Was bedeutet Reifen Vorne Links bei Fahrzeug vorne links. Das Spielchen könnte man weiter treiben und die Objekte weiter unterteilen.
Aber ich persönlich denke, dass ein Name auf dem Stack für 99% aller Anwendungsgebiete vollkommen ausreichen sollte. Abgesehen davon würde das die Selektion um einen gehörigen Faktor verkomplizieren, denn leider ist es nun mal so, dass der Treffer als Result zurückgegeben wird. Müsste man sich mal überlegen wie man das am sinnvollsten gestaltet. Aber für den Anfang sollte sich die Auswertung nicht aus dem Tritt bringen lassen auch wenn sie (fälschlicherweise) nur den ersten Namen zurückliefert.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo nochmal,
nimm doch in deiner Resize- und deiner Selection-Funktion
glOrtho(0 , 640, 0, 480, -128, 128);
dann bist auf jeden Fall erstmal auf der sicheren Seite.
Ich hab mir nochmal genauer deinen Quellcode angesehen und mir ist aufgefallen, daß man in deinem speziellen Fall doch von jeweils vier Werten pro Hit ausgehen kann, sorry da hab ich nicht ganz aufgepasst. Das liegt aber nur daran, da du für jedes Objekt immer genau einen Namen lädst.
Falls ein Objekt einen 'Hit' produzierst hast du also garantiert immer genau einen Namen auf dem Stack.
Theoretisch wäre es aber auch möglich mehrere Namen auf einen name-stack zu laden und zwar falls du statt glLoadName(), glPushName() vewenden würdest.
Dies wäre z.B. bei hierarchischen Modellen ganz sinnvoll.
Stell dir z.B. vor du hast ein Modell von einem Auto. Du lädst zuerst einen Namen (besser gesagt eine ID) für das Auto, dann 'pushst' du in der zweiten Hierarchieebene jeweils Namen für die vier Räder und in der dritten Hierarchiebene vielleicht noch Namen für die Felgen (die jeweils zu einem Rad gehören).
Wenn du dann auf die Felge klickst bekommst du drei Namen, nämlich für die Felge, das zugehörige Rad und das Auto.
Warum es bei dir aber nun trotzdem nicht klappt?
Hmmm...also das es im Vollbildmodus nicht ganz korrekt klappt kann ich vielleicht noch erklären.
Auf deinem Screenshot sieht es fast so aus, als würdest du direkt zwischen zwei Quadraten klicken.
In diesem Falle scheint es fast Zufall zu sein, welches Quadrat dann ausgewählt wird, da ja alle Quadrate im Orthomodus denselben Z-Wert haben (da du direkt von oben raufschaust).
Du bekommst dann zwei Hits und deinem Code nach zu urteilen, würde dann das Quadrat, welches den ersten Hit produziert, farblich markiert werden.
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.