myszka w opengl

JA
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:25
0

Cześć, mam problem z kawałkiem zadania z openGL. mam już stworzone obiekty (koła, kwadraty itp.) i wrzucone to do jednej listy i teraz potrzebuję usuwać kliknięte obiekty. nie wiem jak zapisać to w funkcji obsługującej myszkę, mam coś takiego na razie:

Kopiuj
std::list<Figury*> lista;

void display()...
void keybord()..

void onMouseButton(int button, int state, int x, int y)
{
	double openglX = ((double)x - 400) / 800 * 6.68;
	double openglY = -((double)y - 300) / 600 * 3.34;

	
		if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
			for (auto it = vec.begin(); it != vec.end();) {
				if () {
					it = vec.erase(it);
				}
				else {
					it++;
				}
			}
		
		}
	
	
}




ale nie wiem jak to rozwinąć :/

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Najprostsza sytuacja występuje wtedy, gdy masz kamerę ortogonalną - wtedy sprawdzanie kolizji jest stosunkowo proste i ogranicza się do tzw. point in polygon hit testing, co powinieneś być w stanie bez problemu napisać sam.

Btw, Twój kod (mimo braku prawidłowej instrukcji warunkowej) zawiera poważny bug - poczytaj o iterator invalidation.


edytowany 6x, ostatnio: Patryk27
Azarien
nie widzę w tym kodzie problemu z "iterator invalidation", możesz rozwinąć?
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:36 minut
  • Postów:6656
2

Skoro masz koła/kwadraty, to masz obiekty 2D.
Musisz napisać funkcje, które sprawdzą, czy pozycja kliknięcia znajduje się w danej figurze.

Zakładając, że dobrze liczysz pozycję kliknięcia, to powinieneś napisać metodę wirtualną w klasie Figury i ją przeciążyć w klasie Kwadrat i Koło.
Metoda ta powinna przyjąć pozycję kliknięcia, a przeciążone metody powinny wykrywać, czy ta pozycja znajduje się w figurze. Zwracamy bool. True jeśli pozycja myszy znajduje się w figurze, false, jeśli nie.
Ciało pętli, którą pokazałeś, będzie wyglądać mniej więcej tak (nie piszę w C++ od dawna...):

Kopiuj
                if (it->kolizja(openglX, openglY)) {
                    it = vec.erase(it);
                    break;
                }

                it++;

🕹️⌨️🖥️🖱️🎮
edytowany 5x, ostatnio: Spine
Patryk27
Nawet jeśli figury są dwuwymiarowe, przy trójwymiarowej kamerze obliczenia będą znacznie bardziej skomplikowane (np. kwadrat na który patrzysz pod kątem n stopni itd.).
Spine
Wiem, ale skoro miał już "szablon do wypełnienia", to sądzę, że ewentualny nauczyciel aż tak nie chciał utrudnić tego zadania i założyłem, że poprawnie przelicza pozycję myszki i figury są odpowiednio wyświetlane na płaszczyźnie. W przypadku kwadratu, na który patrzę pod kątem, zrobiłbym raycast.
JA
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:25
1

Dzięki za pomoc Spine - potrzebowałem takiego właśnie uporządkowania mojego myślenia. Napisałem metody do koła i prostokąta/kwadrata i wszystko śmiga. Dzięki jeszcze raz :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.