gluProject() und glWrapper lib

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

gluProject() und glWrapper lib

Beitrag 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
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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?
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
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.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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???
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
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.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
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.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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.
Antworten