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

Aktuelle Zeit: Fr Jul 18, 2025 12:32

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: gluProject
BeitragVerfasst: Do Nov 09, 2006 15:03 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hi, ich möchte an die projezierten koordinaten meines lichtes kommen,
jetzt habe ich das problem das gluProject matrizen erwartet, ich aber bei glGet nur Integer und Doubles bekomme, wie bastel ich das zurecht ? und warum muss ich für den Viewport PInteger anstatt PGLInt nehmen, obwohl im wiki PGLInt steht, geht das net.

Hier Source:
Code:
  1.  
  2. procedure Lightposition;
  3. var
  4.   pos: TVector3D;
  5.   amodelview,
  6.   aprojection: PGLDouble;
  7.   aviewport: PInteger;
  8. begin
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, amodelview);
  10.   glGetDoublev(GL_PROJECTION_MATRIX, aprojection);
  11.   glGetIntegerv(GL_VIEWPORT, aviewport);
  12.   gluproject(light_position[0], light_position[1], light_position[2],
  13.              amodelview, aprojection, aviewport,
  14.              pos.x, pos.y, pos.z);
  15.   MainForm.Caption := floattostr(pos.x) + ' ; ' + floattostr(pos.y));
  16. end;
  17.  


das hier sieht kompliziert aus: http://nehe.gamedev.net/data/lessons/le ... ?lesson=44

mfg und danke schönmal ;)


Zuletzt geändert von Seth am Do Nov 09, 2006 18:34, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 09, 2006 15:59 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du weisst, dass P für Pointer steht?
Da deine Pointer gerade uninitialisiert sind überschreibst du irgendwo im Speicher Daten und kannst dich glücklich schätzen, dass Windows dich nicht abschiesst.

glGet übergibt man die Speicheradressen von Double- oder Integervariablen, damit es dort die Werte speichern kann.
Bei Matrizen erwartet OpenGL nicht nur eine einfache Variable sondern ein Array [0..15] of Variable in das es speichern kann.

Das mit dem PInteger und PGLInt sollte ansich gehen, weil PGLInt = ^TGLInt und TGLInt = Integer. Was für einen Compiler verwendest du denn?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 09, 2006 16:01 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich verwende den normalen delphi compiler, ich probier nochmal biss rum
verstehs aber noch net so ganz, so klappts logischerweise auch net:

Code:
  1.  
  2. procedure Lightposition;
  3.   var
  4.   pos: TVector3D;
  5.   amodelview,
  6.   aprojection: GLDouble;
  7.   aviewport: GLInt;
  8. begin
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, @amodelview);
  10.   glGetDoublev(GL_PROJECTION_MATRIX, @aprojection);
  11.   glGetIntegerv(GL_VIEWPORT, @aviewport);
  12.   gluProject(light_position[0], light_position[1], light_position[2],
  13.              amodelview, aprojection, aviewport,
  14.              pos.x, pos.y, pos.z);
  15.   MainForm.Caption := floattostr(pos.x) + ' ; ' + floattostr(pos.y));
  16. end;
  17.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 09, 2006 16:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
PGLInt oder PInteger ist ziemlich egal. Es dürfte beides nicht gehen. Wenn eines davon klappt ist es Zufall! Das sind Pointertypen und deine Pointer zeigen auf sonst etwas aber nicht auf einen sinnvollen Wertebereich. Damit deine Pointer auch sinnvoll funktionieren müsstest du sie mit New/GetMem oder sonst etwas erzeugen und anschließend wieder frei geben. Dispose oder FreeMem. Aber das Ganze geht auch wesentlich einfacher.

Im Selektion Artikel aus dem Wiki wurde es wie folgt gemacht. Eine Variable des Types array[0..1] of Integer wird deklariert und dessen Pointer (operator @) wird an die Methode übergeben.

Code:
  1. var
  2.   VP: array[0..1] of Integer;
  3. begin
  4.   glGetIntegerv(GL_MAX_VIEWPORT_DIMS, @VP);


Das wars schon. So viel zum notwendigen Hintergrund. Im Artikel von gluUnProject ist im übrigen auch ein Beispiel dabei. Viel anders sollte es bei gluProject auch nicht sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Nov 09, 2006 16:11 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
so ähnlich wie bei den beispielen hatte ich das zuerst auch, ich probier nochmal ;)

so vermutlich:
Code:
  1.  
  2. procedure Lightposition;
  3. var
  4.   x, y, z: GLDouble;
  5.   viewport: TGLVectori4;
  6.   modelview: TGLMatrixd4;
  7.   projection: TGLMatrixd4;
  8. begin
  9.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelview);
  10.   glGetDoublev(GL_PROJECTION_MATRIX, @projection);
  11.   glGetIntegerv(GL_VIEWPORT, @viewport);
  12.   gluProject(light_position[0], light_position[1], light_position[2],
  13.              modelview, projection, viewport,
  14.              @x, @y, @z);
  15.   MainForm.Caption := floattostr(x) + ' ; ' + floattostr(y);
  16. end;
  17.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 11, 2008 20:11 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Kann ich irgendwie prüfen, ob der projezierte Punkt sichtbar wäre oder muss ich auf Raycasting o.Ä. zurückgreifen ?
Wie mache ich das am einfachsten ?

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 11, 2008 23:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich wollte Dir gerade antworten "den Tiefenpuffer auslesen", aber ich habe vorher die Forensuche angeworfen mit dem Stichwort "Sichtbarkeit" und bin in diesem Thread http://www.delphigl.com/forum/viewtopic.php?t=5493&highlight=sichtbarkeit auf einen Beitrag von LarsMiddendorf gestoßen, der davon abgeraten hat. Er hatte aber eine Alternative anzubieten: Occlusion Queries.

Vor ein paar Tagen wollte jemand das Gleiche wissen wie Du; das ganze hat sich in diesem Thread http://www.delphigl.com/forum/viewtopic.php?t=7483 abgespielt.

NACHTRAG: Immer hab ich noch etwas vergessen :)
In diesem Thread: http://www.delphigl.com/forum/viewtopic.php?t=6895&highlight=selektion+farbe findest Du im letzten Beitrag von Phobeus die Beschreibung des Farb-Picking-Verfahrens. Und wenn mans recht bedenkt, sollte das Ding doch eigentlich auch gleich eine Art kostenloses Occlusion Query sein. Denn wenn es nicht sichtbar ist, ist die Farbe dort durch ein anderes Objekt überschrieben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 08:16 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Ans Farbpicking hatte ich auch schon gedacht, aber das fand ich wenig elegant.
Ich schau mir den Rest mal an, danke ;)

Occlusion Querys sehen (laut Tutorial) danach aus als würden sie nur für NVidea Karten funktionieren. Am liebsten wäre mir natürlich eine allround Methode ;) Die Idee mit dem Tiefenpuffer finde ich garnet mal so schlecht. Ich dachte daran, eine Gerade zu schießen und den Abstand zu bestimmen und mit dem Depthbufferwert zu vergleichen. Funktioniert das ?
Ich brauche ja nur ein paar Punkte abfragen, nicht sämtliche Pixel.


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Sollte schon funktionieren, ich hab es selber nur nie ausprobiert. Du musst dann die Entferung, die Du mit Deiner Geraden misst auf den Wert abstimmen, der aus dem Tiefenpuffer kommt, denn der ist ja im Intervall [0,1]. Du weißt schon, 0=NearPlane und 1=FarPlane, aber der Wert den Deine Geometrie liefert, ist von den Werten bestimmt, mit der Du die Projektionsmatrix bestückt hast, also muss es noch umgerechnet werden, damit man es vergleichen kann.

Ähm, und nicht vergessen: der Wert, den Du mit der Geraden zunächst misst, ist nicht etwa der Abstand Kamera=>Punkt, sondern der Normalabstand Punkt=>Gerade. Wenn Du den Punkt mit dem geringsten Abstand zur Gerade ermittelt hastt, musst Du dann erst den Abstand Kamera=>Punkt noch berechnen. Occlusion Culling ist da keines dabei. Das ist ein schwerer Nachteil.

Und deshalb find ich die Farbselektionsmethode eigentlich sogar sehr elegant, denn sie schlägt zwei Fliegen auf eine Klappe: Sie sagt Dir
1. Ob und wenn ja welches Objekt auf dem angeklickten Punkt zu finden ist, und es ist
2) ganz sicher ein sichtbares Objekt.

Gamasutra hat was bezüglich Occlusion Culling: http://www.gamasutra.com/view/feature/3394/occlusion_culling_algorithms.php

Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 18:46 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Der Nachteil ist, dass ich die ganze Szene zweimal zeichnen muss ;) Zum Glück aber nur ohne alles und den punkt soll ich dann mit GL_POINT einzeichnen ? verschwindet der net ab einer bestimmten Entfernung oder ist der immer 1px ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 20:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 15:18
Beiträge: 62
Seth hat geschrieben:
den punkt soll ich dann mit GL_POINT einzeichnen ? verschwindet der net ab einer bestimmten Entfernung oder ist der immer 1px ?

Ausprobieren :idea:

Ich glaube, dass diese ganzen Funktionen ihre Größe nicht verändern. Auf jeden Fall stimmt das bei Linien - die sind immer genau gleich dick.

Grüße,
Yogu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 20:21 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
kann ja aber sein, dass ich durch Rundungsfehler nicht den Pixel treffe, also sollte ich doch besser eine kleine Kugel zeichnen ;)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 16:50 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Hässlich bei Farbselektion ist, dass man
1. Bei 16 Bit Farbtiefe auch nur diese 16 bit verwenden kann. Falls man unvorsichtig beliebige 24bit Farben verwendet selektiert er einem dann häufig das falsche/gar nichts
2. Anti-Aliasing kann die Farbe verfälschen
3. Das Verhalten des Programms/Spiels ist an die Grafikengine/karte gebunden.
Ich persönlich mag raycasting ganz gerne, ist aber etwas aufwändiger zu Implementieren.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 17:52 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Wie Raycasting prinzipiell funktioniert weiß ich. Ich würde es auch gerne implementieren, aber das angesprochene Problem mit der Kameraposition etc. verstehe ich noch nichts ganz. Beispielsources wären nützlich.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 17, 2008 00:20 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Code:
  1. //Projektionsmatrix setzen, 45° vertikaler öffnugswinkel, keine Translationen etc
  2.   glMatrixMode(GL_PROJECTION);
  3.   glLoadIdentity;
  4.   gluPerspective(45.0,form1.clientwidth/MainRenderHeight , NearClipping, FarClipping);
  5.  
  6. //Modelviewmatrix setzen
  7.   glMatrixMode(GL_MODELVIEW);
  8.   glLoadIdentity;
  9.   glScalef(1,-1,1);//Händigkeit des Koordinatensystems
  10.   Rotate and translate
  11.  
  12. //Inverse Modelviewmatrix berechnen
  13.   glGetfloatv(GL_MODELVIEW_MATRIX,@mat);
  14.   //Daten für ScreenToWorldBerechnen
  15.   invmat:=mat;
  16.   MatrixInvert(invmat);
  17.  
  18. //Abstand in dem 1Pixel=1OpenGL Einheit
  19.  ScreenDistance:=0.5*MainRenderHeight/tan(pi/8);pi/8=45°/2
  20.  
  21. //Ursprung berechnen
  22.  //Origin:=invmat*(0,0,0)
  23.  origin:=vectortransform(vector(0,0,0),invmat);
  24.  //invmat*(ScreenX-Width/2,ScreenY-Height/2,ScreenDistance)-Origin
  25.  direction:=vectorsubtract(vectortransform(vector(ScreenX-form1.clientwidth/2,ScreenY-MainRenderHeight/2,ScreenDistance),invmat),Origin);

Liefert dir Ursprung und Richung des Strahls vom Beobachter durch einen Pixel auf dem Bildschirm.

Für Ray gegen Mesh hätte ich auch noch code. Der ist allerdings relativ ungetested und verwendet noch keine Raumunterteilung(es wird also gegen alle Dreiecke getestet)

_________________
Bild


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.010s | 15 Queries | GZIP : On ]