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

Aktuelle Zeit: Fr Jul 18, 2025 00:27

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Okt 11, 2006 22:14 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wir hatten hier ja schon mehrfach über Selektion geredet. Nun bräuchte ich auch mal selbe für einen MapEditor (ja ich auch. ;) )

Ich dachte mir, wieso nicht diese Methode implementieren. Da ich allerdings kein besonders gutes Matheverständnis habe wollte ich fragen, obs dafür passenden Code gibt? (Im Techniken&Algorithmen Teil des Wikis gibts leider noch keine Selection-Artikel)

Ich hab auch gar keine Ahnung wie ich
1. Den Vector für die Linie bestimme (irgendwie die MVMatrix misbrauchen),
2. Die Position der Dreiecke ins passende KOSystem umrechne
3. Diese Sachen möglichst performant mache.

Wäre für Code sehr dankbar. (Vorallem da ich weiß, dass bereits einige diese Methode benutzen 8) )

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 12, 2006 08:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wozu das Rad neu erfinden :)
http://www.sulaco.co.za/opengl_project_line-polygon_collision_detection.htm
Dann musst du nur noch zusehen wie du ein raycast erzeugst.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 12, 2006 17:14 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Damit bliebe nur noch Nr1 offen. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 12, 2006 17:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn ich nicht ganz eingerostet bin, dann hat man ein raycast über das projezieren des cursors auf die Far und Near-clipping Plane geregelt.
Ich glaube sogar, dass du in den Newton Demos von SOS fündig werden wirst.
Vor langer langer Zeit, wo die Erde noch ein guter Ort war, hab ich auf der Nehe Seite ein tut zum thema Cursor projektion gesehen.
Dabei wurde die Position des Cursor auf der Nearclipping Plane und Farclipping Plane bestimmt und die beiden Punkte ergeben dann den Start- und End-punkt des Raycasts.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 12, 2006 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
Mittels gluUnproject kannst du deine Mauskoordinaten auf der Nearclipping- und auf der Farclippingplane bestimmen. Die Selektionsgerade verläuft durch diese beiden Punkte. Damit hast du auch den Richtungsvektor und zugleich den nähsten Punkt auf der Gerade zur Kamera. Damit kannst du auch sicherstellen, dass keine Objekte hinter der Kamera selektiert werden.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 13, 2006 10:19 
Offline
DGL Member

Registriert: Fr Okt 06, 2006 13:55
Beiträge: 12
Wo das Thema hier gerade ansteht bzw genannt wurde, möchte ich da mal nachhaken.
Ich hab gestern ca. 4h lang mit gluUnProject, den beispielen hier und den ganzen Infos im Netz verbracht und bin dann frustriert schlafen gegangen,

ich hab eine fläche, die ist 20x20 GL-Eingeiten breit und zwar von -10 bis 10 jeweils und liegt direkt auf y 0.0

meine camera ist bei x=0, y=15, z=15 und guckt direkt auf 0,0,0 somit schau ich von schräg oben auf die fläche.
Wenn ich nun den beispielcode, der hier in jedem gefundenen post, bei nehe und co. auftaucht benutze, kommen bei mir recht wirre sachen bei raus.
zum einen ist die screencoordinate z, die ich per ReadPixel direkt unter der maus auslese immer 0.0 egal wo ich hinclicke, also egal welche x/y ich nutze, es ist immer 0.0
Dazu kommt, daß die Koordinaten, die mir gluUnProject zurückgibt nicht ansatzweise in meinem sichtbereich liegen. klick ich mehr oder weniger in die Mitte des bildschirmes, bekomm ich eine x-coordinate, von ca 40 (mittelpunkt ist 0,0,0 und die gläche geht nur bis 10, somit also ausserhalb des screenbereiches) und y sowie z liegen irgendwo zwischen 300 und 400. das ist über und hinter der der camera. setz ich den wert für z manuel höher (wenn ich das richtig kapiert hab ist z=0.0 die camera und z=1.0 maximale entfernung?) gehen die werte für die x y und z, die gluUnProject ermittelt in horrendehöhen.

Da ich mir nicht sicher war, wann genau ich den kram ausführen muss, hab ich einfach mal jede stelle im code versucht. direkt nachm clearBuffer, nachm rendern direkt vorm swapbuffer, direkt danach also direkt vorm nächsten clearbuffer... ein befriedigendes ergebniss hab ich nicht bekommen.

Ich muss eh nen Ray casten anhand von den Mausdaten um rauszufinden, wo nun genau die fläche getroffen wurde, vielleicht sehen die werte ja auch nur so falsch aus, liefern aber sinnvolle positionen für meinen ray. ich hatte nur keine motivation mehr gestern.

Vielleicht bin ich aber auch coll aufm holzweg.

Hier nochmal der Code, falls es wen interessiert:

Code:
  1.  
  2. Vector3f Core::screenTo3d( int x, int y)
  3. {
  4.     GLdouble modelMatrix[16];
  5.     GLdouble projMatrix[16];
  6.     GLint viewport[4];
  7.     GLdouble sx, sy, sz, z;
  8.     glGetDoublev( GL_MODELVIEW_MATRIX, modelMatrix);
  9.     glGetDoublev( GL_PROJECTION_MATRIX, projMatrix);
  10.     glGetIntegerv( GL_VIEWPORT, viewport);
  11.  
  12.     glReadPixels( x, viewport[3] - y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);
  13.  
  14.     gluUnProject( (float)x, (float)viewport[3] - (float)y, z, modelMatrix, projMatrix, viewport, &sx, &sy, &sz);
  15.     return Vector3f( sx, sy, sz);
  16. }
  17.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 13, 2006 10:28 
Offline
DGL Member

Registriert: Fr Okt 06, 2006 13:55
Beiträge: 12
Spaßiges ergebniss hab ich gerade:
direkt vorm Ende der Renderroutine wird auf meinem RenderEvent postRender( float) aufgerufen:
Code:
  1.  
  2. bool Quam::postRender( float t)
  3. {
  4.     if( bButtonState[GLFW_MOUSE_BUTTON_1])
  5.     {
  6.         Vector3f pos = co->screenTo3d( iMousePos[0], iMousePos[1]);
  7.         printf( "Coords I got: %f %f %f\n", pos.x, pos.y, pos.z);
  8.     }
  9.     return true;
  10. }
  11.  

Damit wird das also jeden frame ausgeführt...

Ohne daß ich die Mausbewege passiert folgendes:
Code:
  1.  
  2. Coords I got: -41.613705 -100.651604 -254.061478
  3. Coords I got: 4119.756836 10064.509766 25352.087891
  4. Coords I got: -412017.312500 -1006451.812500 -2535263.000000
  5. Coords I got: 41201692.000000 100645184.000000 253526240.000000
  6. Coords I got: -4120169216.000000 -10064519168.000000 -25352626176.000000
  7. Coords I got: 412016934912.000000 1006451884032.000000 2535262781440.000000
  8. Coords I got: -41201692573696.000000 -100645184995328.000000 -253526282338304.000000
  9. Coords I got: 4120169374810112.000000 10064519271284736.000000 25352629307572224.000000
  10. Coords I got: -412016934259785728.000000 -1006451918538539008.000000 -2535262982296829952.000000
  11. Coords I got: 41201695762440781824.000000 100645186631173668864.000000 253526305926264389632.000000
  12. Coords I got: 0.000000 0.000000 0.000000
  13. ...
  14.  


Irgendwas schein ich richtig falsch zu machen ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 13, 2006 11:33 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
ReadPixel ist ne ganz blöde sache.
Wie schon erwähnt, nimmt man die near und far clippingplane, da diese immer gleich sind und nur das dargestellt wird, was dazwischen liegt.
Ein ReadPixel kann durch Objekte, die sich vor ein anderes schieben völlig sinnlose werte ergeben.
Code:
  1. float nearclipping=0.1;
  2. float farclipping=100;
  3. ...
  4. gluUnProject( (float)x, (float)viewport[3] - (float)y, nearclipping, modelMatrix, projMatrix, viewport, &nearx, &neary, &nearz);
  5. gluUnProject( (float)x, (float)viewport[3] - (float)y, farclipping, modelMatrix, projMatrix, viewport, &farx, &fary, &farz);
  6. //code zum testen ob Geometry(quad,triangle,box,sphere,...) mit Linie kollidiert
  7. //wenn eine Kollision statt findet dann ist es ein potenzielles Ergebnis


Je nach einsatzgebiet, sollte noch ein zSort, der resultierenden Ergebnisse gemacht werden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 13, 2006 12:41 
Offline
DGL Member

Registriert: Fr Okt 06, 2006 13:55
Beiträge: 12
Hmm, ich hoffe ich nerf nicht ;)
Ich mach nun kein glReadPixel mehr, sondern versuch es, wie du es sagtest, mit 0.1 und 100.

ich guck jetzt von 0.0 5.0 0.0 nach 0.0 0.0 0.0 also direkt von oben nach unten.

funktionalität wie oben gepostet, nur halt mit festem z: ergebniss eines klicks mehr oder weniger in die mitte des bildschirms:
UnProjecting %f %f %f gibt die x y und z die ans unproject geschickt wird aus,
Result: %f %f %f gibt das ergebniss in sx sy sz zurück.

UnProjecting: 397.000000 302.000000 0.100000
Result: 0.707610, 388.927457, -199.528265
UnProjecting: 397.000000 302.000000 100.000000
Result: -0.006455, 501.013310, -200.004309

Ich glaub ja immernoch, daß ich hier was total falsch mache.
ich mal sogar mit GL_LINES ne linie zwischen den ergebnissen, die natürlich das, was ich in den zahlen sehe bestätigen, nix auch nur ansatzweise so, wie ich es erwarte :p


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 13, 2006 13:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Naja die Linie kannst du auch nicht sehen, ausser du bewegst dich, nachdem du die linie gezeichnest hast.
Die Linie ist einer Normal von der Fläche Viewport zu betrachten und wird allerhöchstens mit einem kleinen Punkt zu sehen sein.
Als ich dies zum ersten mal gemacht hab, dachte ich auch ich mach was völlig falsch :wink:.
Wie schon erwähnt, einfach die position zwsichenspeichern und dann mal mit der "kamera" bewegen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 13, 2006 16:07 
Offline
DGL Member

Registriert: Fr Okt 06, 2006 13:55
Beiträge: 12
hmm, jo, wenn ich mir das so angucke, sind das schicke linien, aber sie erfüllen nicht den zweck, den sie sollen ;)
er malt sie schon irgendwie basiert auf der maus, aber viel zu hoch über der fläche.
Ich werd mir mal den View Fructum angucken und dann schauen, ob ich nicht selbst ne linie geworfen bekomme.
Anhand der Daten mit denen man GL initiert hat müsste man ja auch so rausfinden können, wo genau die NearPlane und wo genau die FarPlane liegt (in 3d Coordinaten) Anhand der breite und der Höhe der Nearplane und dazu der Breite und der Höhe vom Screen müsste ich doch recht einfach die exakte position der Maus auf der Nearplane rausfinden. dann bau ich mir nen Ray indem ich die Normale der Nearplane nehme und mit der Tiefe (im defaultfall 100.0f) multipliziere. Somit müsste ich ne Ray direkt unter der Maus quer durch den sichtbaren bereich haben, oder?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.008s | 14 Queries | GZIP : On ]