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
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.
- 1. OpenCV + OpenGL + Qt
- 2. MATLAB, jak uzyskać współrzędne kliknięcia myszą
- 3. OpenGL + Qt przy użyciu CMake
- 4. Jak przekonwertować projekt oparty na NIB na oparty na scenorysie?
- 5. spłaszczyć listę/obiekt oparty na rekordach na ramkę danych
- 6. Obiekt/klasa Qt do pliku Qt ui
- 7. Wiele rzutni OpenGL z Qt 5
- 8. Okna dialogowe Eclipse otwierają się dwukrotnie po kliknięciu myszą
- 9. uzyskać adres po kliknięciu na mapę
- 10. Jak uzyskać Qt 5.0 współpracując z Qt Creator 2.5.2?
- 11. OpenGL rysuje nad widżetami w Qt
- 12. Qt C++ Biblioteka dla Windows i OpenGL
- 13. Qt 5.5.0 nie może znaleźć funkcji OpenGL
- 14. Projekt oparty na Cordova na Fabric
- 15. Framework UI oparty na języku JavaScript oparty na języku JavaScript
- 16. Jak uzyskać znaczniki wewnątrz obszaru wybranego za pomocą przeciągnięcia myszą?
- 17. PowerShell oparty na pythonie?
- 18. Tekst na obraz najechany myszą?
- 19. Terminal oparty na RPG
- 20. Aplikacja Qt MDI z OpenGL: jak pobrać prawidłowy zrzut ekranu?
- 21. Spring - kontroler oparty na adnotacjach - RequestMapping oparty na ciągu zapytań
- 22. Interpreter oparty na Prologu
- 23. Jak zainstalować QtQuick 1.1 na QT 5.1.1
- 24. OpenGL rysuje obiekt częściowy w przewijanym panelu
- 25. OpenGL: Jak uzyskać procent wykorzystania GPU?
- 26. OpenGL lub OpenGL ES
- 27. Używanie najnowszych funkcji OpenGL w klasach w Qt 5.4
- 28. Jak uzyskać obiekt z HttpResponseMessage?
- 29. Jak uzyskać obiekt z RuntimePropertyInfo?
- 30. Jak uzyskać typ MIME pliku w Qt?
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. –
@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
Robię zbieranie za pomocą gluUnProject & glReadPixels, ale wynikiem jest zawsze najbezpieczniejszy obiekt zamiast najbliższego, z jakiego powodu? – jondinham