Skocz do zawartości

Współrzędne myszy na wsp. OGL-a.


5corpio

Polecane posty

Witam. Pisząc edytor3d odrazu na początku natrafiłem na problem przemiany współrzędnych myszy na ekranie na współrzędne w OpenGL-u. Wymyśliłem taki sposób:
[code=Delphi]
tPos.p1 i tPos.p2 to Single i współrzędne w OpenGL-u
HXH^HHZ[YCBXZ[KvGFf&VvBF&Ś'śćvĆ&ŚFąąąŚ4(4(ŃAĄ
`ź5]Ńąkom - (Global.Zoom / 2);
tPos.p2 := (Cursor.Y / MainForm.IZY
H
[HH
[HNHHXHŚW7BćRF\0 [/code]

Wszystko wygląda jakby obliczane było dobrze. Jednak wyświetlając piksel w obliczonym miejscu coś jednak nie gra :/
im bliżej krawędzi ekranu tym odchylenia +/- w kierunkach jest większa. Jednak naciskając na środek ekranu
mam współrzędne 0,0 (pomijam trzecią). Czy problemem może być ustawienie okna czy coś ?

PS. w tej składni Delphi kompletnie nie czytelne są komentarze nic nie widać dlatego pominołem //

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

[code=Delphi] {***********************************************************CB[[]ŃÓĘN
[YN[Ńf fWw'C'& amp;ł5bFVvW#FVfWsltą4(Ńlt
le;
winZ: Single;
Tmp:record
X,Y,Z:double;
eBY[B]X]ÓÓSŃSQUÓPUV[[Y]ĘNBvvWDFV&ĆWbt$T5DE$&ŚV7FvvWDĄ1}Y%]A=IPą4(ĄdŃĄd4(ąIixels(X,viewport[3]-Y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,@winZ)B[ÓU[X
Y]KVK[[[Y]ŚV7FfWw'BFFF&W7VBŁFąŃ4(ąŃ4) [/code]
//kawalek mojego starego projektu (kod nie moj of course ;p)
Link do komentarza
Udostępnij na innych stronach

Dzięki Wam biggrin.gif Oszczędziliście mi czytania artykułu. Ale nadal mnie zastanawia bo [b]wsumie obliczenia wychodziły chyba dobre przy tych 2 wzorkach. Ale dobra zastosuje to rozwiązanie co podaliście.

Już poradziłem sobie tongue.gif dołączyłem gl a nie OpenGL już nie ma problemu ;p

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Zastanawiam się czemu to mi zwraca jakieś kosmicznie duże liczby np. X ~ 100 albo coś takiego biggrin.gif

[b]Pozatym nie będzie to widoczne na ekranie?

PS. zapomniałem dopisać już w 1 poście, że wybieranie i klikanie dotyczy widoków ortogonalnych(z góry,z boku z przodu) nie w widoku perspektywistycznym.

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

  • 6 months later...
Pozwolę sobie odegrzać ten stary wątek ponieważ mam problem związany dokładnie z tym samym. Otóż mam tą funkcje która zamienia wsp. myszki z ekranu niby na te w OpenGL-u. Z tego co zauważyłem rozpiętość w każdej osii zależy od ustawień zNear czyli np. jak ustawie zNear na 1 to współrzędne OGL-a odczytane przez te funkcje będą z zakresu np. -0.5 do 0.5 itp. Potrzebuje odczytywać oczywiście wartości większe itp. zwiększyłem zNear to mi ucina połowe ekranu itp. pokaże na przykładzie:

[img]http://img147.imageshack.us/my.php?image=screen4nd.jpg[/img]

jak widać ten jeden trójkąt z linii jest ucinany w pewnym momencie.

Dlatego co zrobić, żeby te współrzędne działały i nie "ucinało" mi tych trójkątów itp. ?

Czy może zostawić zNear na 1 a poprostu wynikowe współrzędne odpowiednio przemnażać o jakieś powiększenie czy coś ?

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Witam!

Nie wiem dokładnie o co chodzi bo zakręciłeś z tym near, ale powiem tyle ze najlepiej to rzutować wszystkie wyniki (punkty kliknięcia) na płaszczyznę przechodzącą przez punkt (0,0,0)skierowaną do kamery, później przy teście czy klikasz blisko punktu możesz tylko sprawdzić odległość punktu od prostej przechodzącej przez punkt kliknięcia o wektorze kamery smile.gif. Ogólnie to najlepiej napisz co chcesz zrobić bo nie wiem tongue.gif.

Pozdrawiam
Spiker ^*^

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

Mam tą całą funkcję z użyciem gluUnProject, która mi zwraca pozycje OpenGL klikniętego miejsca i teraz wstawiam sobie 3 punkty powstaje trójkąt jednak przy obrocie, ruchu kamery on zostaje coś "przycinany".

Jak na zdięciu:

http://img428.imageshack.us/my.php?image=screen5nd.jpg

czemu te zdięcia się nie wyświetlają ?

Gdy kamera jest ustawiona w pozycji w której były tworzone punkty(wierzchołki) trójkąt jest widoczny normalnie, obróce kamerę i jest "cięty" dziwnie lub całkowicie znika gdy powinien być widoczny.

Poza tym jak już ten trójkąt będzie to jak oddale kamerę nie ważne czy to przez gluLookAt czy po prostu glTranslatef to ten powstały trójkąt jakoś nie proporcjonalnie się zmniejsza w stosunku do oddalanej kamery znaczy się staje się bardzo szybko mały.


Ew. jakiś inny sposób na np. wstawianie wierzchołków w miejscu kliknięcia.

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

CYTATMam tą całą funkcję z użyciem gluUnProject, która mi zwraca pozycje OpenGL klikniętego miejsca i teraz wstawiam sobie 3 punkty powstaje trójkąt jednak przy obrocie, ruchu kamery on zostaje coś \"przycinany\".

Na samym początku musisz sobie jakoś kontrolować wartość Z kliknięcia żeby nie zwracało Ci wartości far gdy klikniesz na tło. Zazwyczaj najlepiej zerować wynik kliknięcia płaszczyźnie przechodzącej przez środek układu lub przechodzącej przez punkt poprzedniego kliknięcia przez rzutowanie.

Co do zdjęcia to sprawdź to ustawienie przycinania kamery. Oddalając kamerę trójkąt się szybko zmienia bo masz chyba coś pokręcone z perspektywą może nawet zamiast oddalać kamerę zmieniasz perspektywę.

[quote] Ew. jakiś inny sposób na np. wstawianie wierzchołków w miejscu kliknięcia. [/quote]
No to też pisałem już że miejsce kliknięcia i podaje wartość Z która trzeba zerować (rzutując na płaszczyznę) wtedy wszystko będzie dobrze.

www.spider.dathox.com :)

Link do komentarza
Udostępnij na innych stronach

  • 5 weeks later...

Witam smile.gif
mam problem z gluUnProject a mianowicie cos nie bardzo chce zwracac prawidlowe wsp,

ogolnie moze po krotce opisze co robie

wszystko co rysuje lezy na osi Z w 0;

moja funkcja reshapujaca jest standardowa

Pascalvoid myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glGetIntegerv( GL_VIEWPORT, viewportT );
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (float) w/h, 1.0, 2000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}


funkcja rysujaca
Pascalvoid display()
{
glClear(GL_COLOR_BUFFER_BIT);
glRenderMode(GL_MODELVIEW);
glPushMatrix();
//na starcie X,Y sa 0 i Z=1000;
gluLookAt(X, Y,Z, X, Y, 0, 0.0, 1.0, 0.0);
glGetDoublev( GL_MODELVIEW_MATRIX, model );
glGetDoublev( GL_PROJECTION_MATRIX, project );

//tresc graficzna

glPopMatrix();
glFlush();
glutSwapBuffers();
}

przy kliknieciu mysza wywoluje
Pascalvoid GetOGLPos(int x, int y)
{
int i;
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;


printf("nviewport");
for(i=0;i<4;i++) printf("[%d]",viewportT[i]);
printf("nx %d,y %dnmodel",x,y);
for(i=0;i<16;i++) { if(!fmod(i,4)) printf("n");printf("[%f]",model[i]); }
printf("nproject");
for(i=0;i<16;i++) { if(!fmod(i,4)) printf("n"); printf("[%f]",project[i]); }
winX = (float)x;
winY = (float)viewportT[3] - (float)y;
glReadPixels( x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject( winX, winY, winZ, model, project, viewportT, &posX, &posY, &posZ);
printf("nnwsp winZ (%f,%f,%f)n",posX,posY,posZ);
}

a wynik jaki otrzymuje jest nastepujacy
viewport[0][0][1280][800]
x 727,y 547
model
[1.000000][0.000000][0.000000][0.000000]
[0.000000][1.000000][0.000000][0.000000]
[0.000000][0.000000][1.000000][0.000000]
[0.000000][0.000000][-1000.000000][1.000000]
project
[1.508883][0.000000][0.000000][0.000000]
[0.000000][2.414214][0.000000][0.000000]
[0.000000][0.000000][-1.001001][-1.000000]
[0.000000][0.000000][-2.001000][0.000000]

wsp winZ (180.178692,-304.439847,-999.953294)

lub

viewport[0][0][1280][800]
x 688,y 636
model
[1.000000][0.000000][0.000000][0.000000]
[0.000000][1.000000][0.000000][0.000000]
[0.000000][0.000000][1.000000][0.000000]
[0.000000][0.000000][-1000.000000][1.000000]
project
[1.508883][0.000000][0.000000][0.000000]
[0.000000][2.414214][0.000000][0.000000]
[0.000000][0.000000][-1.001001][-1.000000]
[0.000000][0.000000][-2.001000][0.000000]

wsp winZ (0.049706,-0.244386,999.000000)

roznica jest taka ze ten pierwszy wynik gzie Z=-999 jest wynik bliski prawdy
a gdy Z=999 to wynik jest bardzo daleki od prawdy

proszę o jakie kolwiek wskazówki które pomogą mi się uporać z tym tematem

moze pomoce bedzie jak dodam ze tresc graficzna to są same kreski tak wiec jak klikam na ekranie to nie zawsze klikam na czyms czasem to
jest pusta przestrzen
probowalem pod moją grafiką wyswietlic jakis duzy kwadrat na Z=-1 i tez to samo sad.gif

ok gdy ustawiam polozenie kamery Z=2000 i polozenie kursora winZ =1 w gluunproject to otrzymuje dobre
wspolrzedne, niestety gdy obnize kamere to juz wsp sie rozjezdzają:(
jakies pomysły co musze poprawić?

wsp (0.049706,-0.244386,999.000000) zuwazylem ze gdy 3 wsp czyli Z jest bliska 0 to zwracane wsp są okej,
ale nie wiem czemu czasami ta wsp nie jest bliska 0 i wtedy wynik mi nie pasuje,

ktos wie moze jak zmusic gluunproject zeby zwracal wsp dla punktu o wsp Z 0;
?????

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...