gluUnProject: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Trennlinien entfernt)
K (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.)
 
(13 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= gluUnProjekt =
+
= gluUnProject =
 +
 
 +
 
  
<br>
 
 
== Name ==
 
== Name ==
'''gluUnProjekt''' - rechnet Fensterkoordinaten in Objektkoordinaten um.
+
'''gluUnProject''' - rechnet Fensterkoordinaten in Objektkoordinaten um.
 +
 
 +
 
  
<br>
 
 
== Delphi-Spezifikation ==
 
== Delphi-Spezifikation ==
  '''function''' gluUnProject(''winx'', ''winy'', ''winz'': TGLdouble;  
+
  function '''gluUnProject'''(''winx'', ''winy'', ''winz'': TGLdouble;  
                       ''modelMatrix'': TGLMatrixd4;  
+
                       const ''modelMatrix'': TGLMatrixd4;  
                       ''projMatrix'': TGLMatrixd4;  
+
                       const ''projMatrix'': TGLMatrixd4;  
                       ''viewport'': TVector4i;  
+
                       const ''viewport'': TGLVectori4;  
 
                       ''objx'', ''objy'', ''objz'': PGLdouble): TGLint;
 
                       ''objx'', ''objy'', ''objz'': PGLdouble): TGLint;
  
<br>
+
 
 +
 
 
== Parameter ==
 
== Parameter ==
<table border=1 rules=all>
+
{| border="1" rules="all"
<tr>
+
! ''winx'', ''winy'', ''winz''
<td>''winx'', ''winy'', ''winz''</td>
+
| Die umzurechnenden Fensterkoordinaten.
<td>Die umzurechnenden Fensterkoordinaten.</td>
+
|-
</tr>
+
! ''modelMatrix''
<tr>
+
| Die aktuelle Modelviewmatrix. (wie sie mittels [[glGetDoublev]] abgefragt werden kann.)
<td>''modelMatrix''</td>
+
|-
<td>Die aktuelle Modelviewmatrix. (wie sie mittels [[glGetDoublev]] abgefragt werden kann.)</td>
+
! ''projMatrix''
</tr>
+
| Die aktuelle Projektionsmatrix. (wie sie mittels [[glGetDoublev]] abgefragt werden kann.)
<tr>
+
|-
<td>''projMatrix''</td>
+
! ''viewport''
<td>Die aktuelle Projektionsmatrix. (wie sie mittels [[glGetDoublev]] abgefragt werden kann.)</td>
+
| Das aktuelle Sichtfeld. (wie es mittels [[glGetIntegerv]] abgefragt werden kann.)
</tr>
+
|-
<tr>
+
! ''objx'', ''objy'', ''objz''
<td>''viewport''</td>
+
| Enthält die berechneten Objektkoordinaten.
<td>Das aktuelle Sichtfeld. (wie es mittels [[glGetIntegerv]] abgefragt werden kann.)</td>
+
|}
</tr>
+
 
<tr>
+
 
<td>''objx'', ''objy'', ''objz''</td>
 
<td>Enthält die berechneten Objektkoordinaten.</td>
 
</tr>
 
</table>
 
  
<br>
 
 
== Beschreibung ==  
 
== Beschreibung ==  
'''gluUnProjekt''' rechnet Fensterkoordinaten, mittels ''modelMatrix'', ''projMatrix'' und ''viewport'', in Objektkoordinaten um.<br>
+
'''gluUnProject''' rechnet Fensterkoordinaten, mittels ''modelMatrix'', ''projMatrix'' und ''viewport'', in Objektkoordinaten um.<br>
Das Ergebnis wird in ''objx'', ''objy'' bzw. ''objz'' abgelegt. <br>
+
Das Ergebnis wird in ''objx'', ''objy'' bzw. ''objz'' abgelegt.<br>
 +
 
 +
Der Rückgabewert ist '''GL_TRUE''', wenn die Berechnung erfolgreich war, und '''GL_FALSE''', wenn ein Fehler aufgetreten ist.
 +
 
 +
 
 +
 
 +
== Beispiel ==
 +
 
 +
<source lang="pascal">function WinPosTo3DPos(X, Y: Integer): TGLVectord3;
 +
var
 +
  viewport  : TGLVectori4;
 +
  modelview : TGLMatrixd4;
 +
  projection: TGLMatrixd4;
 +
  Z        : TGLFloat;
 +
  Y_new    : Integer;
 +
begin
 +
  glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
 +
  glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
 +
  glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
 +
  Y_new := viewport[3] - y; // In OpenGL steigt Y von unten (0) nach oben
 +
 
 +
  // Auslesen des Tiefenpuffers an der Position (X/Y_new)
 +
  glReadPixels(X, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z );
 +
 
 +
  // Errechnen des Punktes, welcher mit den beiden Matrizen multipliziert (X/Y_new/Z) ergibt:
 +
  gluUnProject(X, Y_new, Z, modelview, projection, viewport, @Result[0], @Result[1], @Result[2]);                       
 +
end;</source>
 +
 
 +
 
  
Der Rückgabewert ist '''GL_TRUE''' wenn die Berechnung erfolgreich war und '''GL_FALSE''', wenn ein Fehler aufgetreten ist.
 
<br>
 
 
== Siehe auch ==
 
== Siehe auch ==
[[glGet]], [[gluProject]]
+
[[glGet]], [[gluProject]], [[glReadPixels]]
 +
 
 +
[[Kategorie:GLU|UnProject]]

Aktuelle Version vom 10. März 2009, 19:22 Uhr

gluUnProject

Name

gluUnProject - rechnet Fensterkoordinaten in Objektkoordinaten um.


Delphi-Spezifikation

function gluUnProject(winx, winy, winz: TGLdouble; 
                      const modelMatrix: TGLMatrixd4; 
                      const projMatrix: TGLMatrixd4; 
                      const viewport: TGLVectori4; 
                      objx, objy, objz: PGLdouble): TGLint;


Parameter

winx, winy, winz Die umzurechnenden Fensterkoordinaten.
modelMatrix Die aktuelle Modelviewmatrix. (wie sie mittels glGetDoublev abgefragt werden kann.)
projMatrix Die aktuelle Projektionsmatrix. (wie sie mittels glGetDoublev abgefragt werden kann.)
viewport Das aktuelle Sichtfeld. (wie es mittels glGetIntegerv abgefragt werden kann.)
objx, objy, objz Enthält die berechneten Objektkoordinaten.


Beschreibung

gluUnProject rechnet Fensterkoordinaten, mittels modelMatrix, projMatrix und viewport, in Objektkoordinaten um.
Das Ergebnis wird in objx, objy bzw. objz abgelegt.

Der Rückgabewert ist GL_TRUE, wenn die Berechnung erfolgreich war, und GL_FALSE, wenn ein Fehler aufgetreten ist.


Beispiel

function WinPosTo3DPos(X, Y: Integer): TGLVectord3;
var
  viewport  : TGLVectori4;
  modelview : TGLMatrixd4;
  projection: TGLMatrixd4;
  Z         : TGLFloat;
  Y_new     : Integer;
begin
  glGetDoublev(GL_MODELVIEW_MATRIX, @modelview ); //Aktuelle Modelview Matrix in einer Variable ablegen
  glGetDoublev(GL_PROJECTION_MATRIX, @projection ); //Aktuelle Projection[s] Matrix in einer Variable ablegen
  glGetIntegerv(GL_VIEWPORT, @viewport ); // Aktuellen Viewport in einer Variable ablegen
  Y_new := viewport[3] - y; // In OpenGL steigt Y von unten (0) nach oben

  // Auslesen des Tiefenpuffers an der Position (X/Y_new)
  glReadPixels(X, Y_new, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @Z );
  
  // Errechnen des Punktes, welcher mit den beiden Matrizen multipliziert (X/Y_new/Z) ergibt:
  gluUnProject(X, Y_new, Z, modelview, projection, viewport, @Result[0], @Result[1], @Result[2]);                         
end;


Siehe auch

glGet, gluProject, glReadPixels