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

Aktuelle Zeit: Mi Jul 09, 2025 08:39

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Komme mit gluUnProject nicht klar...
BeitragVerfasst: So Sep 09, 2007 13:04 
Offline
DGL Member

Registriert: Fr Apr 20, 2007 16:21
Beiträge: 17
Hallo zusammen,

ich habe ein Problem mit gluUnProject. Ich habe mir schon zig Themen dazu durchgelesen, aber nichts Vergleichbares gefunden.

Also:
Ich möchte eine Art Worldeditor basteln. Dazu hab ich ein einfaches Grid. Die einzelnen Vertices werden jetzt in der Höhe verschoben, so dass ein Terrain entsteht. Wenn ich jetzt gluUnProject mit den Werten aus dem Wiki übernähme, könnte ich die SICHTBARE Position der angeklickten Stelle herausfinden. Ich möchte jedoch die "tatsächliche" Position, d.h. nur die Position im Grid ohne berücksichtigung der Höhe - so als würde ich ein imaginäres Quad über das Terrain legen. Wenn ich das allerdings tue, sehe ich ja die Szene nicht mehr, selbst mit Blend...

Oder anders ausgedrückt: Ich möchte die 3D-Position eines Klicks auf einer bestimmten Höhe (y-Wert), ohne dass Objekte gezeichnet sind.

Falls es schon einen Thread gibt, wo diese Frage gestellt wird, genügt mir auch ein Link. Ich habe bereits das halbe Wiki durchgeackert, aber das ist für Anfänger leider nicht einfach zu verstehen... muss ich irgendetwas am Modelmatrix - Parameter verändern?

Als Anhang ein kleines Modell, in Blender gebastelt, vllt hilft es zum Verständnis...
:shock:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 13:13 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ich glaube so einfach, wie du dir das erhoffst, wird das nix.
Ich wuerde vorschlagen: Bau Selection ein, damit du die Knotenpunkte anfassen kannst. Dann errechne dir anhand der Bewegung der Maus die Höhenverschiebung des Punktes und es sollte funktionieren


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 13:22 
Offline
DGL Member

Registriert: Fr Apr 20, 2007 16:21
Beiträge: 17
hm. Erst mal danke für die schnelle Antwort. Das höre ich natürlich nicht gern.

Wäre es da nicht vllt einfacher, nach einem Klick nur ein einfaches Quad zu zeichnen, die Position zu berechnen und dann wieder die Szene zu zeichnen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 13:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Andere Idee für Selektion:
Zeichne bei einem Klick deine Szene oder die entsprechenden "drüberliegenden" Quads einmal, aber ohne Tex. etc. und gib jeder Gridposition eine leicht andere Farbe, zB. für eine Variable i per
Code:
  1. glColor3b(i and $FF, (i shr 8) and $FF, (i shr 16) and $FF);

Wenn du einen 32 bit FrameBuffer verwendest, kannst du so schnell bis zu 16.7 Mio Werte (24 bit) zuweisen. Dann kannst du beim Klick per glReadPixels die Farbe an der angeklickten Stelle erfahren und dementsprechend zurückrechnen. Wenn du auch den Alphakanal bzw. glColor4b nutzen kannst (habs noch nicht ausprobiert), dann wären sogar 4.3 Mrd Möglichkeiten (alle 32 bit) bzw. 1 Integer oder Single oder 2 Words drin.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 09, 2007 14:29 
Offline
DGL Member

Registriert: Fr Apr 20, 2007 16:21
Beiträge: 17
OK, das klingt recht kompliziert... :D

Ich hab das mal mit einem Quad probiert, dass ich vor dem UnProject zeichne und danach wieder lösche, das klappt ganz gut soweit. Das Problem wäre also gelöst. Ich habe allerdings schon ein nächstes... :shock:

Nämlich das Timebased Movement klappt bei mir dummerweise net so ganz. Hab das alles so gemacht wie im Wiki beschrieben, und EIGENTLICH funktioniert es auch - bei 50 FPS bin ich nicht viel schneller als bei 30 FPS. Nicht viel. Aber doch ein bisschen. Und wenn ich dann gar nichts zeichne und so 700-900 FPS hab, komm ich so gut wie gar nicht mehr von der Stelle. Ist mein OnIdle-Code falsch? Oder ist das normal?

Vielen Dank im Voraus..

Code:
  1. procedure TFEngine.Idle(Sender: TObject; var Done: Boolean);
  2. begin
  3.  QueryPerformanceCounter(QPCStart);
  4.  Render;
  5.  QueryPerformanceCounter(QPCEnd);
  6.  DrawTime:=Ceil((QPCEnd-QPCStart)/QPCFreq*1000);
  7.  Inc(TimeCount, DrawTime);
  8.  Inc(FrameCount);
  9.  if TimeCount >= 1000 then
  10.   begin
  11.    Frames:= FrameCount;
  12.    TimeCount:= TimeCount - 1000;
  13.    FrameCount:= 0;
  14.    Errorstring:=gluErrorString(glGetError);
  15.   end;
  16.  Done:= false;
  17. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 10, 2007 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hi,
hast du schon mal versucht Ceil in Zeile 6 wegzulassen?
Du willst doch für DrawTime genau einen Float-Wert haben... Dann musst du Zeile 7 auch noch ändern:

Neue Zeile 6 und 7:
Code:
  1. DrawTime:=(QPCEnd-QPCStart) / QPCFreq * 1000;
  2. TimeCount := TimeCount + DrawTime;

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 10, 2007 14:45 
Offline
DGL Member

Registriert: Fr Apr 20, 2007 16:21
Beiträge: 17
Nein, habe ich noch nicht probiert, da Drawtime ein Integer ist - mit Floor ändert sich aber auch nicht viel..

//edit: habe das alles mal in Float geändert und Ceil weggelassen, aber das Ergebnis ist das Gleiche


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 10, 2007 15:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Da hab ich auch stundenlang dran rum geknabbert...

...ich werd heut abend nach der arbeit (psst! nich petzen) mal genau schauen wie ich das gemacht habe.

aber eins weiss ich noch. ich habe Drawtime beim letzten Durchlauf gespeichert und errechne den Durchschnitt aus beiden. Ist dann etwas smoother.


gruß

damadmax


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 10, 2007 15:15 
Offline
DGL Member

Registriert: Fr Apr 20, 2007 16:21
Beiträge: 17
Hm, sagt mir jetzt noch nicht so viel... Aber schon einmal vielen Dank im Voraus. Kann es nicht vielleicht sein, dass der OnIdle-Durchlauf schon so lange dauert, dass Drawtime gar nicht mehr die eigentliche Zeit pro durchlauf ist, sondern eben nur der Prozedur Render und diese beim Zeichnen keiner Objekte zu schnell läuft?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 11, 2007 10:01 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
und DICH hab ich vergessen. Sry. Hole ich heute nach :)

dann nimm doch den ganzen Durchlauf als DrawTime. Obwohl die Variable auch eher FrameTime heissen sollte. Du musst ja schliesslich die gesamte Zeit berücksichtigen, die ein Durchlauf benötigt. Also auch sämtliche andere Berechnungen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 11, 2007 14:15 
Offline
DGL Member

Registriert: Fr Apr 20, 2007 16:21
Beiträge: 17
So, ich glaube, ich komme langsam des Geheimnis Lösung näher. Ich habe den Code jetzt geändert:

Code:
  1. procedure TFEngine.Idle(Sender: TObject; var Done: Boolean);
  2. begin
  3.  Render;
  4.  QueryPerformanceCounter(QPCEnd);
  5.  DrawTime:=(QPCEnd-QPCStart)/QPCFreq*1000;
  6.  QueryPerformanceCounter(QPCStart);
  7.  TimeCount:=TimeCount+DrawTime;
  8.  Inc(FrameCount);
  9.  if TimeCount>=1000 then
  10.   begin
  11.      Frames:=FrameCount;
  12.      TimeCount:=TimeCount - 1000;
  13.      FrameCount:=0;
  14.    Errorstring:=gluErrorString(glGetError);
  15.   end;
  16.  Done:= false;
  17. end;


Jetzt wird die Zeit des gesamten Vorgangs gemessen. Anzeige: DrawTime=17ms, FPS=60. Obwohl ich bis auf drei Achsen nichts zeichne. Hat das jetzt was mit VSync zu tun? Und wenn ja, wie krieg ich das abgestellt? Im Hintergrund besitzt die Applikation übrigens noch ein Fenster mit Delphi-Komponenten..

Also ich meine, ich weiß wie man VSync im Treiber abstellt, aber der nVidia-Treiber gibt an "Force Off", "Force On" oder "Application Controlled" (oder so).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 11, 2007 15:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Code:
  1. wglSwapIntervalEXT(0);

Zum Ausschalten, 1 zum Einschalten.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 11, 2007 16:54 
Offline
DGL Member

Registriert: Fr Apr 20, 2007 16:21
Beiträge: 17
Dankeschön, läuft ausgezeichnet.
:wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 11, 2007 17:33 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Ich würde sogar nur ein QueryPerformanceCounter pro frame machen. Also immer einfach die differenz zum letzen frame nehmen. Dabei solltest du dann aber auch noch darauf achten die für DeltaTime verwendete Differenz auf 0 bis 100ms einzuschränken.

_________________
Bild


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


Wer ist online?

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