Autor Wątek: Rzutowanie punktu w świat :)  (Przeczytany 950 razy)

Offline djsmtih

  • Użytkownik

# Maj 08, 2009, 21:27:23
Zakładam ten temat drugi raz(ostatni skasowałem zanim ktoś odpowiedział bo myślałem że znalazłem na forum odp na moje pytanie).
Już bez zbędnego gadania :)
Mam:
Pozycje myszki x(-1;1) y(-1;1)
i chce ją przekształcić na wektor umażliwiający zaznaczanie różnych obiektów w świecie 3d.
Teraz robie to tak:
Vector V(MouseX * (width/height),MouseY,1,0f)
Camera->RotateAsCamera(V);
Niestety nie działa promień leci w dobrą "ćwiartkę" ekranu ale bardzo nie dokładnie.

« Ostatnia zmiana: Maj 08, 2009, 22:11:39 wysłana przez djsmtih »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline counterClockWise

  • Użytkownik

# Maj 08, 2009, 21:32:42
Stwórz prostą przechodzącą przez 2 punkty (X_SCREEN, Y_SCREEN, Z_NEAR) oraz punkt (X,Y,Z) oka.

A jeżeli chcesz to google: "picking".

Wygooglowany na szybko przykład:
private void DoPicking(short mouseX, short mouseY)
{
    // Clamp mouse coordinates to viewport
    if (mouseX < 0) mouseX = 0;
    if (mouseY < 0) mouseY = 0;
    if (mouseX > this.sampleFramework.Device.Viewport.Width) mouseX = (short)this.sampleFramework.Device.Viewport.Width;
    if (mouseY > this.sampleFramework.Device.Viewport.Height) mouseY = (short)this.sampleFramework.Device.Viewport.Height;
 
    // Put mouse coordinates in screenspace Vector3's. These are the points
    // defining our ray for picking, which we'll transform back to world space
    Vector3 near = new Vector3(mouseX, mouseY, 0);
    Vector3 far = new Vector3(mouseX, mouseY, 1);
 
    // Transform points to world space
    near.Unproject(this.sampleFramework.Device.Viewport, camera.ProjectionMatrix, camera.ViewMatrix, scannerWorldMatrix * Matrix.RotationY(scannerRotationTimer));
    far.Unproject(this.sampleFramework.Device.Viewport, camera.ProjectionMatrix, camera.ViewMatrix, scannerWorldMatrix * Matrix.RotationY(scannerRotationTimer));
...
}
« Ostatnia zmiana: Maj 08, 2009, 21:34:34 wysłana przez counterClockWise »

Offline djsmtih

  • Użytkownik

# Maj 08, 2009, 22:03:28
Może wkleje kod:
ScreenWidth = 600; ScreenHeight = 600;
...
gluPerspective(45.0f,1, 0.01f, 10000.0f);   
...
glGetIntegerv(GL_VIEWPORT,viewport);
...
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
GLxPos = (xPos - (viewport[2]/2))/(viewport[2]/2);
GLyPos = (-(yPos - (viewport[3]/2))/(viewport[3]/2)); //Do tąd jest dobrze na 100% bo gui mi działa :)
V = Cam.Position //Szukany promień pkt 1
VA = Vector(GLxPos,GLyPos,1.0f); //Szukany promień kierunek
Cam.RotateAsCamera(VA);

Rysowałem to na karteczce z 10 razy i powinno działać ale nie działa

Edit:Znalazłem błąd
gluPerspective(45.0f,1, 0.01f, 10000.0f);    - myślałem że kąt 45 stopni to kąt rozwarcia w jedną stronę(czyli razem 90)
a nie w obie, przez to źle liczyłem wszystko.
« Ostatnia zmiana: Maj 09, 2009, 02:51:00 wysłana przez djsmtih »

Offline counterClockWise

  • Użytkownik

# Maj 10, 2009, 01:29:54
Edit:Znalazłem błąd
gluPerspective(45.0f,1, 0.01f, 10000.0f);    - myślałem że kąt 45 stopni to kąt rozwarcia w jedną stronę(czyli razem 90)
a nie w obie, przez to źle liczyłem wszystko.

Gratulacje, czyli problem rozwiązany :)

OT: Generalnie (poza szczególnymi przypadkami) nie polecam ustawiania tak bliskiej bliskiej płaszczyzny obcinania przy jednocześnie tak dużej dalekiej - wartości zbierają się w malutkim przedziale i czasem pojawiają się problemy z precyzją.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 10, 2009, 05:47:06
Cytuj
OT: Generalnie (poza szczególnymi przypadkami) nie polecam ustawiania tak bliskiej bliskiej płaszczyzny obcinania przy jednocześnie tak dużej dalekiej - wartości zbierają się w malutkim przedziale i czasem pojawiają się problemy z precyzją.
A skąd wiesz, że ta wartość jest bliska? Co do dalekiej płaszczyzny obcinania, można ją ustawić właściwie gdziekolwiek bez zbytniej straty precyzji. :)

Offline counterClockWise

  • Użytkownik

# Maj 10, 2009, 11:30:58
A skąd wiesz, że ta wartość jest bliska? Co do dalekiej płaszczyzny obcinania, można ją ustawić właściwie gdziekolwiek bez zbytniej straty precyzji. :)

Nie mam pojęcia czy jest bliska - wnioskuję, że jest po dalekiej. Owszem, daleką można gdziekolwiek, ale duża wartość sugeruje dużą skalę świata.

Offline djsmtih

  • Użytkownik

# Maj 10, 2009, 15:55:28
U mnie człowiek średniej wielkości ma 0.5 wysokości :)