Sprawdzenie czy gracz kliknął na obiekt.

0

Witam,
próbuję teraz zrobić grę w OpenGL, w której trzeba będzie znajdywać przedmioty porozrzucane w świecie 3d :) Poruszanie się mam, wyświetlanie, wszystko jest. Niestety za bardzo nie wiem jak odczytać, czy gracz kliknął myszką na przedmiocie który miał znaleźć. Czy ktoś zna jakiś sposób żeby odgadnąć czy gracz kliknął na przedmiot?
Z góry dziękuję za odpowiedzi!

0

Pobierasz informacje o tym gdzie kliknięto a potem sprawdzasz czy jest tam obiekt ;]

0

Hmmm. Właśnie w tym jest problem :/ Nie wiem jak to zrobić. W grze 2d nie było by najmniejszego problemu, natomiast w grze FPS nie wiem jak to zrobić bo dochodzi jeszcze oś Z.

0

Hmm, w 2D to wiadomo, ale w 3D ja bym zrobił promieniem. I sprawdzić czy przecina się z siatką obiektu. W chwili kliknięcia go wypuścić.

Edit:
Ehh pomyślałem trochę o czym innym, to się raczej nie sprawdzi. Hm..

1

Kodu Ci nie podam, bo z opengl bawiłem się parę lat temu, ale osobiście widzę 2 rozwiązania.
1) Bierzesz rzut sceny na płaszczyznę ekranu i sprawdzasz kolor w współrzędnych kliknięcia - dużą wadą jest to, że każdy obiekt musi mieć inny kolor co się wiąże ze specjalnym wyrenderowaniem klatki na potrzeby testu

2) Liczysz równanie prostej przechodzącą przez punkt położenia kamery i punkt kliknięcia(tu za z można przyjąć współrzędną Z bliższej płaszczyznę obcinania), sprawdzasz punkty przecięcia tej prostej z obiektami na scenie. Kliknięty obiekt to ten, którego miejsce przecięcia z prostą jest najbliżej płaszczyzny ekranu.

Mam nadzieję, że nie napisałem bzdur ;)

1

Ja takie coś realizowałem przez GL_SELECT: http://glprogramming.com/red/chapter13.html z tym że ograniczałem obszar renderowania do tego naokoło klikniętego miejsca.

1

przydatne mogą być funkcje gluProject(), gluUnProject()

0
byku_guzio napisał(a)

Kodu Ci nie podam, bo z opengl bawiłem się parę lat temu, ale osobiście widzę 2 rozwiązania.
1) Bierzesz rzut sceny na płaszczyznę ekranu i sprawdzasz kolor w współrzędnych kliknięcia - dużą wadą jest to, że każdy obiekt musi mieć inny kolor co się wiąże ze specjalnym wyrenderowaniem klatki na potrzeby testu

2) Liczysz równanie prostej przechodzącą przez punkt położenia kamery i punkt kliknięcia(tu za z można przyjąć współrzędną Z bliższej płaszczyznę obcinania), sprawdzasz punkty przecięcia tej prostej z obiektami na scenie. Kliknięty obiekt to ten, którego miejsce przecięcia z prostą jest najbliżej płaszczyzny ekranu.

Mam nadzieję, że nie napisałem bzdur ;)

punkt 1 dało by się zrobić, tylko zajęło by mi to dużo czasu. Obiektów będzie duuużo na jednej mapie i prawdopodobnie będzie problem z pomieszczeniem ich w kolorach RGB ^^
punkt 2 niestety jak dla mnie niewykonalny. Nie wiem jak zrobić.
Jeśli chodzi o GL_SELECT to słyszałem że jest to bardzo nieefektowne i klatkożerne. Być może się mylę.
Co do gluProject to przeraziło mnie to: http://www.opengl.org/wiki/GluProject_and_gluUnProject_code . Dla pewności: gluProject to jedna funkcja pobierająca współrzędne obiektu?

0

punkt 1 dało by się zrobić, tylko zajęło by mi to dużo czasu. Obiektów będzie duuużo na jednej mapie i prawdopodobnie będzie problem z pomieszczeniem ich w kolorach RGB ^^

Ale obiekty nieaktywne lub w danym momencie nieinteresujące mogą mieć jeden kolor. Poza tym możesz użyć 32 bitów, a nie 24. Chociaż wiadomo, że im mniej bitów tym szybciej będzie działać renderowanie.

0

pkt 2 jest jak najbardziej wykonalny
sam koniec artykułu: http://warsztat.gd/articles.php?x=view&id=279

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0