[ maxmagnus2 @ 19.11.2004. 21:13 ] @
Pozdrav svima,
dusu mi izvadi gluUnProject :(
Pokusavao sam i pokusavao, ali je sve sto sam i pronasao na netu
i sam shvatio DA NE RADI ...
Pozivam je na poruku o pustanjanju misa .
Evo koda f-je koji bi trebalo da vrati lokaciju tacke nakon klika:

Tacka4 gde_je_mis()
{
Tacka4 mis; //tacka za izlaz
POINT mouse; // Stores The X And Y Coords For The Current Mouse Position
GetCursorPos(&mouse); // Gets The Current Cursor Coordinates (

GLint viewport[4];
GLdouble modelview[16],modelview1[16];
GLdouble projection[16],projection1[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
cout<<endl<<endl;
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
winX = (GLfloat)mouse.x; // Holds The Mouse X Coordinate
winY = mouse.y; // Holds The Mouse Y Coordinate
winY = viewport[3] - mouse.y;
winY= (GLfloat)winY;

glReadPixels( winX, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

winZ=(GLfloat)winZ;

gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);


mis.x=(float)posX;
mis.y=(float)posY;
mis.z=(float)posZ;
mis.Izdaj();
return mis;
}

Hvala Unapred!!!
MM
[ bkaradzic @ 19.11.2004. 21:39 ] @
Citat:
maxmagnus2: dusu mi izvadi gluUnProject :(
Pokusavao sam i pokusavao, ali je sve sto sam i pronasao na netu
i sam shvatio DA NE RADI ...

"NE RADI" ;)
A ti si siguran da ne praviš grešku?

>>>glReadPixels( winX, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

Prvo, glReadPixels je spora funkcija i trebao bi da izbegneš njeno korišćenje.

Drugo, winZ koji dobiješ je u opsegu 0.0f - 1.0f (homogene koordinate), a winX i winY su ti u screen space koordinatnom sistemu. Prebaci winX i winY u opseg -1.0f do 1.0f i onda probaj opet.

float fWinX = (float)winX*2.0f/fScreenWidth - 1.0f;
float fWinY = (float)winY*2.0f/fScreenHeight - 1.0f;

Nisam siguran da li glReadPixels sa GL_DEPTH_COMPONENT vraća 1/z iz zbuffera... Zato ako ovo ne radi probaj da invertuješ winZ.

Branimir
[ maxmagnus2 @ 23.11.2004. 03:08 ] @
Citat:
bkaradzic: "NE RADI"
A ti si siguran da ne praviš grešku?

Ma da, ja je radim ona nece. Ali ima da ce da oce

Citat:
bkaradzic:
Prvo, glReadPixels je spora funkcija i trebao bi da izbegneš njeno korišcenje.
Branimir

Veoma rado, ali ne znam sa kojom bi je drugom zamenio.
Mada, valjda nije previse spora za logicke slagalice.

Citat:
bkaradzic:
Drugo, winZ koji dobiješ je u opsegu 0.0f - 1.0f (homogene koordinate), a winX i winY su ti u screen space koordinatnom sistemu. Prebaci winX i winY u opseg -1.0f do 1.0f i onda probaj opet.


Ako je koordinata z tu izmedju 0 i 1, kolika je u Lokaciji kamere?

Da li je rastojanje izmedju ravni odsecanja prevedeno u h.
koordinate 1 ?

Ovo me interesuje da bih pomerao objekte pomocu misa u 3d prostoru (pronadjem pravu Kamera-konkretna tacka i isproveravam preseke objekt-prava) .

Ako izbegnem koriscenje glReadPixels onda bih mogao da
postavim drugu tacku prave sa koordinatom z na zadnjoj ravni
odsecanja, ali onda ostaje problem koordinata x,y na toj
ravni.

Pala mi je na pamet ortogonalna projekcija, u njoj je
vektor Kamera.oko-Kamera.Mesto_gledanja paralelan sa pravom
koja bi isla od jedne ravni odsecanja do druge, a sadrzala bi
tacku kojoj je z=0 a na prvoj je ravni odsecanja, tako da ne mora da se koristi glReadPixels.
MM




[ bkaradzic @ 23.11.2004. 18:19 ] @
Citat:
maxmagnus2: Kako se prevodi termin homogene koordinate na eng?

Ja sam koristio izraz "homogene koordinate" (bukvalan prevod), mada nisam siguran da je to ispravno u našoj terminologiji.

Homogeneous Coordinates
http://www.unchainedgeometry.com/jbloom/pdf/homog-coords.pdf

Citat:
maxmagnus2: Ako je koordinata z tu izmedju 0 i 1, kolika je u Lokaciji kamere?


Pa 0.0 je NearZ, a 1.0 je FarZ. Zapravo ide od -1.0 do 1.0, ali to važi samo za X i Y koordinatu. 3D reprezentacija screen space izgleda kao kocka. Da bi iscrtao na ekran ne treba ti Z koordinata, ali da bi izračunao koordinatu iz screen space nazad u world space treba ti i Z.

Citat:
maxmagnus2: Pala mi je na pamet ortogonalna projekcija, u njoj je vektor Kamera.oko-Kamera.Mesto_gledanja paralelan sa pravom koja bi isla od jedne ravni odsecanja do druge, a sadrzala bi tacku kojoj je z=0 a na prvoj je ravni odsecanja, tako da ne mora da se koristi glReadPixels.

Ovo je isti slučaj sa homogenim koordinatama posle projekcije. Jer je pogled u tom prostoru kocka, a ne piramida kao u world space-u.

Branimir
[ yooyo @ 13.12.2004. 13:52 ] @
Tvoj code izgleda korektno. Imam sam par pitanja koja te mogu navesti na resenje problema:

1. GetCursorPos vraca ekransku koordinatu misa. Da li je tvoja aplikacija fullscreen ili windowed?

2. Kada pozivas glReadPixels? Pre ili posle glClearBuffer? Greska moze biti da si obrisao backbuffer ili dobijas pogresne vrednosti zbog toga sto si na kraju render funkcije pozvao SwapBuffers pa je rezultat glReadPixels nedefinisan.

za gluUnproject winX i winY koordinate treba da budu ekranse ali vodi racuna da OpenGL smatra da je ekranska koordinata 0,0 u DONJEM LEVOM cosku ekrana/prozora!

glReadPixels jeste spor ako ga koristis da procitas ceo ekran, ali za jedan pixel radi dovoljno brzo.

AKo zelis da saznas kako gluUnproject radi pogledaj code iz mesa opengl implementacije.

Code:

/* transformation du point ecran (winx,winy,winz) en point objet */
GLint GLAPIENTRY
gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz,
         const GLdouble model[16], const GLdouble proj[16],
         const GLint viewport[4],
         GLdouble * objx, GLdouble * objy, GLdouble * objz)
{
   /* matrice de transformation */
   GLdouble m[16], A[16];
   GLdouble in[4], out[4];

   /* transformation coordonnees normalisees entre -1 et 1 */
   in[0] = (winx - viewport[0]) * 2 / viewport[2] - 1.0;
   in[1] = (winy - viewport[1]) * 2 / viewport[3] - 1.0;
   in[2] = 2 * winz - 1.0;
   in[3] = 1.0;

   /* calcul transformation inverse */
   matmul(A, proj, model);
   invert_matrix(A, m);

   /* d'ou les coordonnees objets */
   transform_point(out, m, in);
   if (out[3] == 0.0)
      return GL_FALSE;
   *objx = out[0] / out[3];
   *objy = out[1] / out[3];
   *objz = out[2] / out[3];
   return GL_TRUE;
}


yooyo