Autor Wątek: OpenGL jednostka  (Przeczytany 1959 razy)

Offline macpak

  • Użytkownik

# Listopad 16, 2006, 22:33:06
Witam mam pytanie , powiecmy ze rysuje sobie kwadrat i kazdy bok kwdratu ma 0.5f , odsuwam powiecmy nasz kwadrat o -4.0f , teraz interesuje mnie jak moge okreslic jaki jest teraz rozmiar mojego kwadratu ale w pikselach -> chce napisac program , wykorzystujac WinApi w ktorym bede mogl "wiedziec" czy najechalem myszka na kwadrat czy nie , wobec czego interesuje mnie jak przeliczyc jednostki OpenGL na piksele . Czy ktos moglby pomoc ??

Offline Mr. Spam

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

Offline siwy

  • Użytkownik

# Listopad 16, 2006, 22:37:33
Kolizje ?

Offline macpak

  • Użytkownik

# Listopad 17, 2006, 08:29:31
Ok , lecz potrzebuje chyba takich samych jednostek , kwadrat narysowany jest w jednostkach OenGL a wspolrzedne myszy pobieram w pikselach , chyba ze jest jakas funkcja OpenGL do pobierania wsp. myszy w jednostkach OpenGL ??


Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 19, 2006, 11:50:59
Najlepiej wszędzie kiedy to możliwe liczyć wszystko we współrzędnych świata 3D i nie interesować się, gdzie to trafi na ekran. Jeśli już trzeba (np. żeby narysować napis 2D nad obiektem 3D) albo przetestować kliknięcie myszką, to można użyć funkcji gluProject i gluUnProject - ja właśnie ostatnio z tym walczę.

Offline kabum

  • Użytkownik

# Listopad 19, 2006, 13:44:20
moze by wykorzystac bufor glebokosci? glReadPixels potem sprawdzac czy GL_DEPTH_COMPONENT nie jest rowny zero w miejscu w ktorym kliknelismy myszka :P
//EDIT ale ten pomysl dotyczy sytuacji w ktorej rysujesz tylko jeden obiekt, w przciwnym przypadku wiedzialbys ze trafiles myszka w jakis obiekt ale nie wiedzialbys w ktory :P
« Ostatnia zmiana: Listopad 19, 2006, 14:00:42 wysłana przez kabooom »

Offline Real_Noname

  • Użytkownik

# Listopad 19, 2006, 14:33:33
Ze wszystkich metod wybierania chyba są tylko dwie najlepsze - matematyczna (liczenie promienia o płaszczyzne, itp) i na kolor (renderujemy pokolorowane obiekty w najprostrzy sposób jaki to tylko możliwe(dla szybkości) i pobieramy kolor). Z czego wadą pierwszego jest szybkość (choć niekoniecznie), a drugiego wymóg 32 bit'owej głębi kolorów (też niekoniecznie :) ). Ja na razie używam drugiej metody i nie narzekam.

Offline Hadrian W.

  • Użytkownik
    • Homepage

# Listopad 19, 2006, 15:20:38
A może zrób własny kursor w OGL'u. Początkowa pozycja to 0,0 i teraz ruch myszki (relative mouse, czy jakos tak 20,-4) dodajesz do aktualnego położenia twojego kursora.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Listopad 20, 2006, 10:08:29
No i wymęczyłem funkcję, która na podstawie pozycji myszy i mając zapamiętane w ramach rysowania po każdej klatce:

// Pobranie informacji do testowania promienia
{
glGetIntegerv(GL_VIEWPORT, m_PickInfo_Viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, m_PickInfo_ModelView);
glGetDoublev(GL_PROJECTION_MATRIX, m_PickInfo_Projection);
m_PickInfo_Saved = true;
}

Potrafi obliczyć promień (punkt początkowy i wektor kierunku) we współrzędnych świata 3D:

bool Engine::CastRay(VEC3 *OutRayOrig, VEC3 *OutRayDir, int WinX, int WinY)
{
if (!m_PickInfo_Saved)
return false;

double MyWinX = static_cast<double>(WinX);
double MyWinY = static_cast<double>(m_PickInfo_Viewport[3]-WinY-1);
double OutX1, OutY1, OutZ1;
double OutX2, OutY2, OutZ2;

if (!gluUnProject(
MyWinX, MyWinY, 0.0,
m_PickInfo_ModelView,
m_PickInfo_Projection,
m_PickInfo_Viewport,
&OutX1, &OutY1, &OutZ1))
{
return false;
}
if (!gluUnProject(
MyWinX, MyWinY, 0.1,
m_PickInfo_ModelView,
m_PickInfo_Projection,
m_PickInfo_Viewport,
&OutX2, &OutY2, &OutZ2))
{
return false;
}

OutRayOrig->x = static_cast<float>(OutX1);
OutRayOrig->y = static_cast<float>(OutY1);
OutRayOrig->z = static_cast<float>(OutZ1);

OutRayDir->x = static_cast<float>(OutX2) - OutRayOrig->x;
OutRayDir->y = static_cast<float>(OutY2) - OutRayOrig->y;
OutRayDir->z = static_cast<float>(OutZ2) - OutRayOrig->z;

return true;
}

Potem już czystą matematyką i bez udziału OpenGL-a (za to z udziałem własnych klas wektorów itp., bo OpenGL takowych nie posiada :P) trzeba policzyć kolizję promienia z czym tam się chce, nie przejmując się już, co gdzie trafi na ekran.