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

Aktuelle Zeit: Mi Jul 16, 2025 20:09

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Objekt per Mouse bewegen
BeitragVerfasst: Mo Feb 14, 2005 19:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Feb 04, 2005 19:27
Beiträge: 14
Hi,
Ich suche nach einer eleganten Möglichkeit, Objekte (Würfel) wie gewohnt mit der Maus zu bewegen. D.h., linke MT auf Objekt drücken, gedrückt halten und verschieben bis zum Loslassen. Ich löse das so, dass ich im Paint die linken und rechten Ränder (-1,-1 und 1,1) umrechne [1] und bei MouseMove prüfe, ob x,y im Bereich dieser Werte ist. Das klappt mäßig gut (wenn ich über ein zweites Objekt ziehe, "verschmelzen" die beiden miteinander; bei schnellen Bewegungen kommt die Graphik nicht mehr mit [2], ich bin plötzlich außerhalb und droppe unerwartet) und scheint mir letzten Endes auch sehr unelegant. Hat jemand Empfehlungen?
TIA, Heiko.

[1]
Code:
  1. glGetDoubleV(GL_MODELVIEW_MATRIX, Addr(ModelView));
  2. glGetDoubleV(GL_PROJECTION_MATRIX, Addr(Projection));
  3. glGetIntegerV(GL_VIEWPORT, Addr(viewport));
  4. gluProject(-1,-1, 0, ModelView, Projection, ViewPort,@x1,@y1,@z);
  5. gluProject( 1, 1, 0, ModelView, Projection, ViewPort,@x2,@y2,@z);
  6. if x1<x2 then begin FLeft:=round(x1); FRight:=round(x2);end else begin FLeft:=round(x2); FRight:=round(x1);end;
  7. if y1<y2 then
  8. begin
  9.    FTop:=Application.MainForm.ClientHeight-round(y2);
  10.    FBottom:=Application.MainForm.ClientHeight-round(y1);
  11. end else
  12. begin
  13.    FTop:=Application.MainForm.ClientHeight-round(y1);
  14.    FBottom:=Application.MainForm.ClientHeight-round(y2);
  15. end;
  16.  


[2] Ich habe immer 85fps, unabhängig, wieviele Würfel ich erzeuge (1..256), ob ich Smooth enable usw. Sind 85fps nicht etwas wenig?

_________________
"Software is like sex, it´s better when it´s free!" (Linus Torvalds)
http://scrabble.game-server.cc


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 14, 2005 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
[1]: Hmm. Ich würde das ganze vereinfachen, und zwar ein großes Quad als Boden festlegen, auf dem du mit glUnProject die x und z Koordinate bestimmst. Dann erst renderst du das/die Quad(s) an die x|z Stelle.

[2]: Du hast V-Sync (per Treiber) aktiviert. Geh mal in deine Grafikkarteneinstellungen (Desktop-Rechtsklick->Eigenschaften->Einstellungen->Erweitert->Grafikkarte). Und dann halt nach "Vertical Sync" suchen und deaktivieren.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 14, 2005 21:41 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Erst mal zum selektieren. Da gibts 2 Möglichkeiten: Die erste ist, du benutzt den normalen OpenGL Weg mit der PickMatrix (gibts hier irgendwo n Tut zu). Hat den Nachteil, dass du alles selektierst, egal, ob verdeckt oder nicht. Die andere Möglichkeit, zu der ich dir raten würde, ist jeden Würfel mit ner eigenen Farbe zu rendern (mit Depth_Test ein) und dann mit glReadPixels die Farbe an der Mausposition auszulesen. Dadurch bekommst du nur den vordersten Würfel.

Wenn du dann also die MT drückst, guckst du ob da ein Würfel drunter ist. Wenn ja merkst du dir nen Pointer oder sowas auf den Würfel. Wenn du dann die Maus bewegst, guckst du nicht jedesmal erneut, was unter dem Cursor ist, sondern bewegst nur den Würfel auf den dein Pointer zeigt. Dann hast du weder das Problem mit dem Verschmelzen, noch dass du bei schnellen Bewegungen den Würfel verlierst.


AL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 14, 2005 22:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Im Tutorial zur Objektselektion steht auch, wie man aus all den gelieferten Objekten das herausfiltert, dass man letztendlich braucht. Es ist also egal, welche Methode du nimmst, ich vermute jedoch, dass die Methode mit den Farben etwas schneller sein könnte, da hier die einzelnen Depht-Werte nicht ein 2. Mal verglichen werden müssen, dass ist aber wie gesagt nur eine Theorie, kann durchaus sein, dass andere Faktoren dies wieder ausgleichen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 15, 2005 12:46 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das mit der Farbe wir spätestens dann blöd, wenn du ne Scene hast, die ja auch Farben besitzt. Dann musst du bestimmte Farben reservieren für die Selection. Glaube die OpenGL Selection ist dahingehend schon die bessere Lösung.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 15, 2005 14:47 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Du musst bei beiden Methode den Würfeln ne ID z.B. in Form eines Longword verpassen. Ob du dass zum Selektieren dann mit glColor3bv oder mit glLoadName übergibst ist dann letzlich auch egal. Nur bei der OGL-Selektion musst du dann noch das Rückgabe-Array parsen, die z-Werte vergleichen und abschätzen welcher näher ist. Bei meiner Methode (oder hat die schon ein anderer irgendwo angewendet) bekommst du sofort die ID des Würfels und das ist dann auch automatisch der Vorderste. Außerdem musst du dich nicht mit der Pick-Matrix und damit, dass sie vor die Projektionsmatrix kommt rumärgern. Wenn du natürlich mehrere Würfel auswählen willst, indem du z.B. nen Rahmen drum ziehst, dann ist die OGL-Methode besser.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 15, 2005 18:55 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Das mit der Farbe wurde IMHO auch im Redbook vorgeschlagen zur Optimierung des Selection-Vorgangs.

Scheint also schneller zu gehen. Problematisch wird es halt, wenn du mehr Objekte renderst, als du Farben hast.
Aber da du wohl nicht in 256 Farben durch die Welt gehst, dürfte sich das Problem auch nicht stellen ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 15, 2005 21:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Gut, und was ist mit Licht und Texturen? Da kannste dann die Methode kippen, oder renderst du das für die selektion in nem speziellen Farbmodus ohne Licht und Texturen?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 15, 2005 22:00 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
Frase hat geschrieben:
Aber da du wohl nicht in 256 Farben durch die Welt gehst, dürfte sich das Problem auch nicht stellen ;)


Das sind doch mehr Farben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 15, 2005 22:08 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Flash hat geschrieben:
Gut, und was ist mit Licht und Texturen? Da kannste dann die Methode kippen, oder renderst du das für die selektion in nem speziellen Farbmodus ohne Licht und Texturen?

Korrekt. Für die Selektion wird einmal quasi ins leere gerendert. Es wird dabei nichts ausgegeben. Über ReadPixels jedoch bekommt man den Farbwert, den man möchte. Danach wird wieder normal gerendert, mit Licht und Texturen, sodass der Anwender nichts davon mitbekommt.

@LH_Freak: Ach ne, gell? Sach bloß... *g*
Wieso wird da wohl ein Smiley am Ende von dem Satz stehen? :wink:

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 15, 2005 23:52 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Und wo renderst du hin. Normal in den Framebuffer. Ok kein Problem, einfach SwapBuffers weglassen und der User merkt nix davon. Hmm und wie machste das am besten mit den Farben? Jeder Mesh in dem Editor ist ne Instanz der Klasse TEditorMesh und hat ne Eigenschaft SelectionColor die absolut eindeutig ist. Beim Zeichnen im Selektionmodus rendert man das Modell ohne Licht, Texturen und schnickschnal nur noch mit der SelectionColor, und die Abfrage wäre geklärt....

Hmmm....eigentlich keine so doofe Idee, das mit den Farben. 8)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 09:04 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Flash hat geschrieben:
Hmmm....eigentlich keine so doofe Idee, das mit den Farben. 8)

Das einzige Problem dabei ist, dass nicht immer alle Farben so angezeigt werden, wie man sie übergibt - besonders, wenn die Darstellung auf 16-Bit eingestellt ist. Dann muss man ein wenig aufpassen, dass auch das richtig Objekt gewählt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 16, 2005 09:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Farben haben im Vergleich zu der Selektion noch den winzigen Nachteil, dass die Selektion ein Stack ist. Wenn du mehrere Objekte der selben Klasseninstanz hast (eine Türklinke die bei 17 Türen verwendet wird) dann müsstest du beim rendern immer eine extra Farbe zuweisen. So könntest du aber anhand des Stacks das Objekt noch eindeutig zuordnen obwohl es mehrfach verwendet wird.
Fragt mich jetzt aber bitte nicht wie das genau geht. Das habe ich bisher auch noch nie gebraucht. Aber normal ist es ja dafür vorgesehen.


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 12 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]