Seite 1 von 2

gluProject() und glWrapper lib

Verfasst: 10.10.2005 21:18
von nicolaus
hallo

wie muß ich da das modelMatrix[16] , projMatrix[16] und viewport[4] übergeben?
Ich verstehe nich ganz wie ich das in der function aus der glWrapper lib übergeben muß.

Nico

Verfasst: 10.10.2005 22:51
von Ynnus
Hier findest du eine Beschreibung der Funktion:
http://www.fh-wedel.de/~eg/cg/opengl/op ... oject.html

Wie du sehen kannst musst du das Model sowie das Project und den Viewport als Pointer auf die Variable übergeben. Da Arrays ja eigentlich auch pointer auf bestimmte Speicherbereiche sind reicht es vielleicht aus, viewport[0] zu übergeben als Speicherstelle und nicht einen Pointer auf viewport[0]. Ich weiß nicht wie man das in PB macht aber unter C++ würde man da nur "Viewport" übergeben, ohne die Klammer und ohne der Angabe des Indices.

Verfasst: 10.10.2005 23:02
von nicolaus
also in C++ oder Delphi würde ich das wie folgt machen:
modelMatrix und projMatrix wären vom typ double

Code: Alles auswählen

 glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix)
 glGetDoublev(GL_PROJECTION_MATRIX,projMatrix)
 glGetIntegerv(GL_VIEWPORT,viewport)
 gluProject(x,y,z,modelMatrix,projMatrix,viewport,winx,winy,winz)
so nun wissen wir ja mitllerweile alle das es noch 100 jahre dauern wird bis man in PB mal mit double rechnen kann also kann ich es nicht so machen wie man es eigentlich macht.
Nun die frage wie bekomme ich das in PB hin?

Verfasst: 11.10.2005 17:30
von DarkDragon

Code: Alles auswählen

Structure DOUBLE_
  l.l
  h.l
EndStructure

Dim viewportCoords.l(3)
Dim ProjMatrixD.DOUBLE_(15)
Dim ModelMatrixD.DOUBLE_(15)

;Double-Funktionen von remi_meiers Optimierer
Procedure DFloat2Double(*d.DOUBLE_, f.f)
	!MOV eax, dword[esp]
	!FLD dword[esp+4]
	!FSTP qword[eax]
EndProcedure

Procedure.f DDouble2Float(*d.DOUBLE_)
	!MOV eax, dword[esp]
	!FLD qword[eax]
EndProcedure

Object_X.f = 0
Object_Y.f = 0
Object_Z.f = 0

glLoadIdentity_()

glGetDoublev_(#GL_MODELVIEW_MATRIX, @ModelMatrixD(0))
glGetDoublev_(#GL_PROJECTION_MATRIX, @ProjMatrixD(0))
glGetIntegerv_(#GL_VIEWPORT, @viewportCoords(0))

DFloat2Double(@ObjX.DOUBLE_, Object_X)
DFloat2Double(@ObjY.DOUBLE_, Object_Y)
DFloat2Double(@ObjZ.DOUBLE_, Object_Z)

gluProject_(ObjX\l, ObjX\h, ObjY\l, ObjY\h, ObjZ\l, ObjZ\h, @ModelMatrixD(0), @ProjMatrixD(0), @viewportCoords(0), @WinX.DOUBLE_, @WinY.DOUBLE_, @WinZ.DOUBLE_)

;Ergebnis
Screen_X.f = DDouble2Float(@WinX)
Screen_Y.f = DDouble2Float(@WinY)
Screen_Z.f = DDouble2Float(@WinZ)
Nicht getestet, sollte aber funktionieren.

Verfasst: 11.10.2005 21:22
von nicolaus
@DarkDragon

Ert mal danke das funktioniert super.

Mich würde aber noch immer interesieren wie ich das ohne dioe doubles in PB hin bekommen würde???

Verfasst: 12.10.2005 07:37
von DarkDragon
nicolaus hat geschrieben:Mich würde aber noch immer interesieren wie ich das ohne dioe doubles in PB hin bekommen würde???
Garnicht.

Verfasst: 12.10.2005 16:24
von nicolaus
@DarkDragon

Nun habe ich gleich noch ne frage zum umgedrehten beispiel und zwar gluUnProject().
Entweder habe ich dein beispiel noch nich wirklich verstanden oder ich weis nich was ich falsch mache.

ich versuche nun mit gluUnProject() wincoords in objectcoordinaten für OGL um zu wandeln doch bekomme cih nur 0.0 raus.
Ich versuche das so:

Code: Alles auswählen

    GetCursorPos_(GlCursor.POINT)
    glGetDoublev_(#GL_MODELVIEW_MATRIX, @ModelMatrixD(0))
    glGetDoublev_(#GL_PROJECTION_MATRIX, @ProjMatrixD(0))
    glGetIntegerv_(#GL_VIEWPORT, @viewportCoords(0))
    DFloat2Double(@x_cursor.DOUBLE_, GlCursor\x)
    DFloat2Double(@y_cursor.DOUBLE_, GlCursor\y) 
    glReadPixels_(GlCursor\x,GlCursor\y, 1, 1,#GL_DEPTH_COMPONENT,#GL_FLOAT, @pixel.f)
    DFloat2Double(@z_cursor.DOUBLE_,pixel)
    gluUnProject_(x_cursor\l, x_cursor\h, y_cursor\l, y_cursor\h, z_cursor\l, z_cursor\h, @ModelMatrixD(0), @ProjMatrixD(0), @viewportCoords(0), @ObjX.DOUBLE_, @ObjY.DOUBLE_, @ObjZ.DOUBLE_)
    Screen_X.f = DDouble2Float(@ObjX)
    Screen_Y.f = DDouble2Float(@ObjY)
    Screen_Z.f = DDouble2Float(@ObjZ)   
doch geht das nich und ich komm nich dahinter warum nich?
Kannst du mir da bitte noch mal helfen und eventuel ne erklärung geben denn ich wüßte echt nich was ich jetzt falsch mache.

Danke dir schon mal,
Nico

Verfasst: 12.10.2005 18:06
von DarkDragon
Hab mein Code mal nach gluUnProject geändert:

Code: Alles auswählen

Structure DOUBLE_
  l.l
  h.l
EndStructure

Dim viewportCoords.l(3)
Dim ProjMatrixD.DOUBLE_(15)
Dim ModelMatrixD.DOUBLE_(15)

;Double-Funktionen von remi_meiers Optimierer
Structure DOUBLE_
  l.l
  h.l
EndStructure

Dim viewportCoords.l(3)
Dim ProjMatrixD.DOUBLE_(15)
Dim ModelMatrixD.DOUBLE_(15)

;Double-Funktionen von remi_meiers Optimierer
Procedure DFloat2Double(*d.DOUBLE_, f.f)
   !MOV eax, dword[esp]
   !FLD dword[esp+4]
   !FSTP qword[eax]
EndProcedure

Procedure.f DDouble2Float(*d.DOUBLE_)
   !MOV eax, dword[esp]
   !FLD qword[eax]
EndProcedure

ScreenX.f = 0
ScreenY.f = 0
ScreenZ.f = 0

glLoadIdentity_()

glGetDoublev_(#GL_MODELVIEW_MATRIX, @ModelMatrixD(0))
glGetDoublev_(#GL_PROJECTION_MATRIX, @ProjMatrixD(0))
glGetIntegerv_(#GL_VIEWPORT, @viewportCoords(0))

DFloat2Double_(@WinX.DOUBLE_, ScreenX)
DFloat2Double_(@WinY.DOUBLE_, ScreenY)
DFloat2Double_(@WinZ.DOUBLE_, ScreenZ)

gluUnProject_(WinX\l, WinX\h, WinY\l, WinY\h, WinZ\l, WinZ\h, @ModelMatrixD(0), @ProjMatrixD(0), @viewportCoords(0), @Obj_X.DOUBLE_, @Obj_Y.DOUBLE_, @Obj_Z.DOUBLE_)

Object_X.f = DDouble2Float_(@Obj_X)
Object_Y.f = DDouble2Float_(@Obj_Y)
Object_Z.f = DDouble2Float_(@Obj_Z)

ScreenX.f = 0
ScreenY.f = 0
ScreenZ.f = 0

glLoadIdentity_()

glGetDoublev_(#GL_MODELVIEW_MATRIX, @ModelMatrixD(0))
glGetDoublev_(#GL_PROJECTION_MATRIX, @ProjMatrixD(0))
glGetIntegerv_(#GL_VIEWPORT, @viewportCoords(0))

DFloat2Double(@WinX.DOUBLE_, ScreenX)
DFloat2Double(@WinY.DOUBLE_, ScreenY)
DFloat2Double(@WinZ.DOUBLE_, ScreenZ)

gluUnProject_(WinX\l, WinX\h, WinY\l, WinY\h, WinZ\l, WinZ\h, @ModelMatrixD(0), @ProjMatrixD(0), @viewportCoords(0), @Obj_X.DOUBLE_, @Obj_Y.DOUBLE_, @Obj_Z.DOUBLE_)

Object_X.f = DDouble2Float(@Obj_X)
Object_Y.f = DDouble2Float(@Obj_Y)
Object_Z.f = DDouble2Float(@Obj_Z)
Nicht getestet.

Verfasst: 12.10.2005 18:34
von nicolaus
erst mal danke aber das geht genauso wenig und is ja eigentlich das selbe wie ich es oben gepostet habe auser das du den Tiefenbuffer nicht mit glReadPixels() ausliest (warum auch immer du das nicht machst).

Was mir jetzt aufgefallen ist , ist das wenn ich gluUnProject()
nach

Code: Alles auswählen

    glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT) 
    glViewport_(0,0,WindowWidth(),WindowHeight())
    glMatrixMode_(#GL_PROJECTION) 
    glLoadIdentity_() 
    glOrtho__(0,WindowWidth(),WindowHeight(),0,0,0)
    glScalef_(zoom,zoom,0.0)
    glMatrixMode_(#GL_MODELVIEW)
    glLoadIdentity_()  
    glTranslatef_(pos_x,pos_y, 0.0) ; Damit man was sieht 
aufrufe bekomme ich immer gleich nen GL error #GL_INVALID_OPERATION
doch wenn ich das for dem obigen code versuche gehts das erste mal gut und ich bekomme coordinaten doch dann nicht mehr nur nach nem neustart der anwendung einmal.
Ich verstehe das irgendwie garnich warum das nicht geht.

Verfasst: 13.10.2005 18:28
von nicolaus
Ich habe jetzt erst mal rausgefunden was das prob ist.
Und zwar liegt es an der funktion glScalef(). wenn ich diese nicht benutze dann geht auch gluUnProject() jedoch brauch ich glScalef() um zu zoomen.
Werd jetzt mal sehen ob ich nch noch anders zoomen kann ohne mit glScalef() zu arbeiten.