2011-06-18 13 views
5

Próbuję utworzyć aplikację w Qt-openGL. Tutaj muszę znać kliknięty obiekt, oparty na kliknięciu myszą. Mój pomysł polega na przechowywaniu punktów (obszar obiektu w QWidget) i dopasowaniu kliknięcia myszką do tych punktów. Czy ktokolwiek może powiedzieć, jak to zrobić ?, czy każde ciało może wykazać w jakikolwiek inny sposób?Qt OpenGL- Jak uzyskać obiekt oparty na kliknięciu myszą

Odpowiedz

14

Ten problem jest zwykle znany jako "zbieranie". Sam OpenGL po prostu rysuje, nie ma zarządzania obiektami geometrii, o którym można mówić (OpenGL ma obiekty, ale są one, jak zwykle nazywamy zasobami).

Najczęstszym sposobem na wdrożenie OpenGL w tych dniach jest pobranie wartości głębokości w pozycji kliknięcia (glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth)) i przeniesienie jej do przestrzeni świata (gluUnProject(...)). To daje (x,y,z) klikniętego punktu.

Ponieważ zazwyczaj zarządzasz geometrią w strukturze przestrzennej (BSP, Kd itp.) Poprzez przechodzenie struktury podziału do współrzędnych kliknięcia, możesz pobrać obiekt w ten sposób.

Inna metoda polega na rzutowaniu promienia, który następuje po kliknięciu w scenie i wykonywaniu testów przecinania objętości.

Zdecydowanie odradzam korzystanie ze starego mechanizmu selekcji OpenGL: jest powolny i nieporęczny w użyciu.

+0

Teraz, gdy popularne są moduły cieniujące, czy nie jest łatwo ustawić identyfikator obiektu dla każdego obiektu i użyć modułu cieniującego do napisania tego na niezmienionej płaszczyźnie ukrytej? Pobranie następnie staje się odczytywaniem z tej płaszczyzny na współrzędnych myszy. Nie ma potrzeby rozpoczynania ani szukania geometrii. –

+1

@Ben Voigt: Tak długo, jak interesuje cię tylko jeden obiekt pod wskaźnikiem myszy - oczywiście pasuje to do metody unprojection - to tak. Jeśli jednak interesują Cię wszystkie obiekty znajdujące się pod kursorem, musisz użyć metody wybierania promienia lub użyć peelingu głębokiego. Jednak w przypadku większości poważnych aplikacji 3D obiekty te i tak zarządzają przy użyciu jakiejś struktury przestrzennej, a wykonanie tego testu jest zwykle łatwiejsze. – datenwolf

+0

Robię zbieranie za pomocą gluUnProject & glReadPixels, ale wynikiem jest zawsze najbezpieczniejszy obiekt zamiast najbliższego, z jakiego powodu? – jondinham

Powiązane problemy