gluProject() und glWrapper lib
gluProject() und glWrapper lib
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
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
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.
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.
also in C++ oder Delphi würde ich das wie folgt machen:
modelMatrix und projMatrix wären vom typ double
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?
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)
Nun die frage wie bekomme ich das in PB hin?
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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)Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Garnicht.nicolaus hat geschrieben:Mich würde aber noch immer interesieren wie ich das ohne dioe doubles in PB hin bekommen würde???
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
@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:
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
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)
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
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Hab mein Code mal nach gluUnProject geändert:
Nicht getestet.
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)Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
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
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.
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
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.