Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 10, 2025 01:29

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Feb 18, 2010 19:05 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
mit gluPickMatrix bekomme ich die Id vom Object (glloadname), die gerade geklickt wurde. etwas ähnliches brauche ich auch für MouseMove event. wie wird das gelöst ohne die Szene zu blockieren?? muss man mit gluPickMatrix unbedingt die Szene zwischendurch noch ein mal rendern?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 18, 2010 19:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
für glPickMatrix ja.

Wenn aber die Objekte, auf die du prüfen willst, im 2D-Raum sind, kannst du auch einfacher umrechnen, ohne die ganze Szene neu zeichnen zu müssen. Wenn du also eine Orthogonale Projektion hast (gl*Ortho* (* = wildcard)), ist der Fall recht einfach.
Darauf kann ich näher eingehen, wenn bedarf besteht.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 18, 2010 20:03 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
bedarf und Interesse besteht ja schon :)
also würde gerne wissen wie du das löst. erzähle bitte etwas mehr davon


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 18, 2010 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Okay. Wenn du in 2D renderst, ist es ja meisten so, dass du für deine Objekte eine Position kennst, die aus X und Y Koordinate besteht. Diese Koordinaten sind dann meist relativ und linear zum Bildschirm. Dann kennst du auch noch die Höhe und die Breite des Elementes. Wenn das soweit zutrifft, ist die Rechnung recht einfach. Du musst nur die Mauskoordinaten in dein Koordinatensystem überführen. Wenn deine Koordinaten den Pixeln der Zeichenfläche entsprechen und oben links entspringen, musst du garnichts umrechnen. Dann ist es nurnoch eine Prüfung, ob ein Punkt in einem Rechteck liegt, wobei das Rechteck aus (X, Y, X + Breite, Y + Höhe) [Links, Oben, Rechts, Unten] besteht. D.h. wenn MX und MY deine Mauskoordinaten sind, prüfst du mit:
Treffer = (MX > X) and (MX < X + Breite) and (MY > Y) and (MY < Y + Höhe).

So habe ich das für meine GUI gelöst. Wenn du dann noch irgendwelche interessanten Formen verbaut hast (Kreise usw.), solltest du deren Prüfung nach der obigen Prüfung machen, da diese dann meist komplexer sind.

Viel Erfolg ;)

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Feb 18, 2010 21:10 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
vielen Dank erst mal für deine Erklärung.
ich rendere eigentlich in 3D. unter http://nehe.gamedev.net/data/articles/a ... article=10 ist ja auch eine article, die ich jetzt implementiert habe. aber wenn ich ein Model von 3DMax importiere, dann kommt ja midestens 10'000 vertexs, davon sind ungefahr 3300 triangle. wenn ich von einem modell 100 mal zeichnen will kan man vorstellen was für grösere Umrechnung kommt. noch schlimmer, wenn man diese modelle bewegt oder umdreht, da die neue positionen von Vertexs auch mitgerechnet werden müssen, für eventuelle weiteren Umrechnungen. daher ist deine Idee auch gar nicht schlect, wenn man diese Methode in 3D umwandeln kann. (mit bestimmter Z-Axis-Entfernung) oder aus 3d ein 2D perspektive erstellt, mit dem Punkt, wo das Mouse koordinaten auf diesem perspective kommt, um zu rechen und mit diesen Argumenten wie eine 2D arbeiten kann.

ob so was überhaupt möglich ist, ist andere Frage.

ich würde aber gerne auch andere Ideen hören.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 19, 2010 00:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du kannst die Cursor-Koordinaten in einen 3D-Strahl umrechnen. Der Strahl beginnt bei der Kamera und zeigt in die Szene hinein. Du musst dann die Dreiecke finden die diesen Strahl schneiden und das mit der geringsten Entfernung wählen.
Code:
  1.     /** return current cursor projected into 3D-space. The resulting ray
  2.      *  points from the cursor into the scene.
  3.      * @param proj A projection matrix, e.g. generated with gluPerspective.
  4.      * @param view A view matrix, e.g. generated with gluLookAt. The matrix
  5.      * must have special layout described here:
  6.      * {@link Matrix44d#getOrthonormalInverse getOrthonormalInverse} */
  7.     public Ray getCursorRay(Matrix44d proj, Matrix44d view) {
  8.         Vector2i viewport = WebGL.getInstance().getFramebufferSize();
  9.         Vector2i revcur = viewport.sub(cursor);
  10.         Vector3d v = new Vector3d(
  11.             -(2*revcur.x/(double)viewport.x - 1.0) / proj._00,
  12.              (2*revcur.y/(double)viewport.y - 1.0) / proj._11,
  13.              -1
  14.         );
  15.         Matrix44d invView = view.getOrthonormalInverse();
  16.         Ray ray = new Ray();
  17.         ray.dir.x = v.x*invView._00 + v.y*invView._10 + v.z*invView._20;
  18.         ray.dir.y = v.x*invView._01 + v.y*invView._11 + v.z*invView._21;
  19.         ray.dir.z = v.x*invView._02 + v.y*invView._12 + v.z*invView._22;
  20.         ray.dir.normalize();
  21.         ray.origin = invView.getW();
  22.         return ray;
  23.     }


Zitat:
noch schlimmer, wenn man diese modelle bewegt oder umdreht, da die neue positionen von Vertexs auch mitgerechnet werden müssen, für eventuelle weiteren Umrechnungen.

Du kannst alle notwendigen Operationen in eine einzige 4x4 Matrix packen.

Zitat:
daher ist deine Idee auch gar nicht schlect, wenn man diese Methode in 3D umwandeln kann.

Das wäre möglich, aber wahrscheinlich nicht effizient. Du kannst zwar die Transformation die die Grafikkarte durchführt simulieren, also die Geometrie in den Screen-Space bringen, allerdings kannst du dann nicht effizient nach Dreiecken suchen.

Wenn du im World-Space bleibst kannst du eine statische Baumstruktur (z.B. Oct-Tree) aufbauen und diese nutzen um das gesuchte Dreieck zu finden ohne alle Dreiecke zu testen.


Eine ganze andere Methode ist das über die Grafikkarte zu lösen. OpenGL hat schon eine eingebaute Selektion, jedoch wird diese nicht von jeder Grafikkarte unterstützt. Daher sollte man das selbst implementieren:
=> http://wiki.delphigl.com/index.php/Tuto ... lorPicking

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 19, 2010 17:20 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
Zitat:
Du kannst alle notwendigen Operationen in eine einzige 4x4 Matrix packen.
wie meinnst du jetzt? ein virtuellen oder unsichtbaren oberflache??


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 19, 2010 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich wollte sagen das es möglich (und üblich) ist sämtliche Operationen die du auf ein 3D-Objekt anwenden kannst in einer einzigen 4x4-Matrix ausdrücken. Solche Operationen wären z.B. Translation (Verschiebung), Rotation und Skalierung. Du musst also für einen einzelnen Vertex niemals mehr als eine Matrix-Multiplikation anwenden, das wären 16 Multiplikationen und 12 Additionen.

Ich habe das geschrieben, weil es sich anhörte als würdest du solche Operationen für aufwendig halten.

Leider ist mir nicht klar was du mit "ein virtuellen oder unsichtbaren oberflache" meinst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 19, 2010 19:19 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
Ich habe gemeint, dass es nicht für mich, sondern für CPU nicht aufwendig sein soll.
also wenn ich mit dem Strahl, wo das Mouse hin geht, die ganze TRIANGLEs vergleichen muss, um raus zu kriegen, auf welchem objekt maus gerade ist wird es dann viel aufwendig für CPU wenn ungefahr 400 oder 500 tausend triangles da sind. das Problem dabei ist, dass ich auch die Koordinaten jeder Vertex jederzeit wissen muss, um es raus zu kriegen. genau das bringt dabei, für jede Vertex diese Operationen. wenn möglich will ich das mindestens etwa %90 verkürzen. und das muss mit MouseMoveEvent schnell gehen. (also mit selection bei mouseclick ist alles ok)

mit unsichtbarem Oberfläche meinte ich eigentlich eines unsichtbaren Objekt, welche etwa %90 weniger triangles hätte und dieses sichtbaren Objekt kapselt, welches der Nutzer in der Anwendung sieht. dann könnte man Intersection test mit diesem unsichtbaren Objekt anwenden, da es schon viel weniger triangles hätte.

vielleicht ist es doch einfacher mit diesem color picking, wenn ich das so einstellen kann dass der nutzer diese selection modus gar nicht merkt ( ein mal in paar milisekunden zu selection modus wechseln und dann wieder in Rendern-Modus, gleichzeitig mit einem objeckt pointer, welche jederzeit das aktuellen objekt zeigt, auf welchem mouse ist) ich werde es mal versuchen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 12:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
wird es dann viel aufwendig für CPU wenn ungefahr 400 oder 500 tausend triangles da sind.

Oben hast du etwas von 10000 Vertices geschrieben, das sind ja ganz andere Dimensionen.

Du kannst auch die Matrix invertieren und anstatt der Vertices einfach den Strahl transformieren. Wenn du z.B einen Oct-Tree einsetzt und dein Mesh nicht zu komplex geformt ist kannst du die Anzahl der getesteten Dreiecke mit großer Wahrscheinlichkeit auf unter hundert reduzieren.

Color-Picking ist wahrscheinlich einfacher zu implementieren, insbesondere bei einer dynamischen Szene. Color-Picking liefert allerdings nicht die exakte Schnittstelle. Wenn du das getroffene Dreieck aber einmal via Color-Picking ermittelt hast brauchst du den Strahl ja nur noch mit diesem einen Dreieck zu schneiden um die Schnittstelle zu erhalten.

Ein reduziertes Mesh zu verwenden ist in jedem Fall eine gute Idee. Die eingebaute OpenGL-Selektion solltest du nicht verwenden.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 12:48 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
Zitat:
Oben hast du etwas von 10000 Vertices geschrieben
stimmt aber das gilt nur für ein Objekt, von dem ich midestens 106 instanz brauche, die sich unabhängig von ein andern verhalten sollte.
Zitat:
Die eingebaute OpenGL-Selektion solltest du nicht verwenden.
meinst du jetzt das mit mit dem gluPickMatrix oder colorpicking??

Also das colorpicking habe ich auch mit GeForce MX200 testen lassen. Das Ergebnis war absolutely perfekt. ich weiss aber noch nicht wie es sich verhält wenn in Szene richtig viele Mesh sind. werde es mal auch überprüfen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 13:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
meinst du jetzt das mit mit dem gluPickMatrix oder colorpicking??

Ich meine gluPickMatrix bzw. glRenderMode(GL_SELECT). Irgendwo im Wiki steht das Grafikkarten teilweise in den Softwaremodus schalten, wenn dieser Modus verwendet wird. Color-Picking in ein FBO sollte aber super funktionieren, da hier keine speziellen Hardwarefeatures benötigt werden.

Zitat:
Das Ergebnis war absolutely perfekt. ich weiss aber noch nicht wie es sich verhält wenn in Szene richtig viele Mesh sind. werde es mal auch überprüfen.

Es ist wichtig das du glScissor benutzt um den Bereich in dem gerendert wird nur auf den einen Pixel zu beschränken den du auch auslesen willst. Gut wäre es natürlich auch dein Viewing-Frustum-Culling darauf anzupassen. Perfekt wäre es wenn du es schaffst eine derartige Projectionmatrix zu generieren das der FBO nur 1x1 Pixel groß sein muss. Ich wüsste allerdings so auf Anhieb jetzt auch nicht wie ich das anstellen sollte.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 13:37 
Offline
DGL Member

Registriert: So Dez 27, 2009 14:23
Beiträge: 45
Danke Coolcat für die Tipps. war sehr hillfreich.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 17 Queries | GZIP : On ]