Autor Wątek: Zamiana jednostek w pikselach na współrzędne OGL  (Przeczytany 702 razy)

Offline Jam_Pawian

  • Użytkownik

# Maj 30, 2009, 13:43:48
Witam

Mam pytanie do Rega i wszystkich, którzy rozumieją funkcje gluProject i gluUnProject. Reg,  dokopałem się do tematu, w którym podałeś funkcję zamieniającą współrzędne myszy na współrzędne OpenGL:     http://forum.warsztat.gd/index.php/topic,2147.0.html
Próbowałem ją zastosować u siebie i wynik jest taki, że zamiast rysować obiekt w miejscu kliknięcia myszy, rysuje go w punkcie (0,0,0) , albo w okolicach.

Używane tablice i zmienna logiczna:
bool m_PickInfo_Saved;
int m_PickInfo_Viewport[10];
double m_PickInfo_ModelView[10];
double m_PickInfo_Projection[10];

Funkcja, którą wywołuję przy renderowaniu każdej klatki:
void CSwiat::Pobierz_dane()
{
// 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;
}



A tutaj funkcja, którą wywołuję po wykryciu kliknięcia myszy:

bool CSwiat::Wylicz_punkt_klikniecia(CVector* Punkt_klikniecia, CVector* Kierunek, int Mysz_x, int Mysz_y)
{

if (!m_PickInfo_Saved)
return false;

double MyWinX = static_cast<double>(Mysz_x);
double MyWinY = static_cast<double>(m_PickInfo_Viewport[3]-Mysz_y-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;
}

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

Kierunek->x = static_cast<float>(OutX2) - Punkt_klikniecia->x;
Kierunek->y = static_cast<float>(OutY2) - Punkt_klikniecia->y;
Kierunek->z = static_cast<float>(OutZ2) - Punkt_klikniecia->z;

return true;
}




I sam moment wywołania tej funkcji:

CVector Punkt_klikniecia, Kierunek;

Wylicz_punkt_klikniecia(&Punkt_klikniecia, &Kierunek, myszka->Click_X, myszka->Click_Y);



99% to Twój kod, zmieniłem tylko nazwy zmiennych. Wiecie co tu jest nie tak?

Offline Mr. Spam

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

Offline Dab

  • Moderator
    • blog

# Maj 30, 2009, 13:53:34
Cytuj
if (!gluUnProject(
      MyWinX, MyWinY, 0.0,

Musisz podać jeszcze współrzędną Z kliknięcia. Mniej więcej w taki sposób:
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

Offline Jam_Pawian

  • Użytkownik

# Maj 30, 2009, 14:19:41
Dzięki za szybką odpowiedź.

Czyli z tego, co zrozumiałem, to zamiast 0.0 mam dać to, co zwróci glReadPixels?

I jeszcze jedno: co mam wysłać tej funkcji (chodzi mi o: winX, winY, winZ )?

Offline Dab

  • Moderator
    • blog

# Maj 30, 2009, 14:38:16
winX, winY - pozycja kliknięcia
winZ - float w którym zapisana zostanie głębokość danego piksela

Offline Jam_Pawian

  • Użytkownik

# Maj 30, 2009, 14:56:22
Ha, działa :)

Dzięki wielkie za pomoc Dab. Zauważyłem też, że nie trzeba wywoływać tej funkcji  Pobierz_dane()  co klatkę, a wystarczy tylko po kliknięciu.