myszka w opengl

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:

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ąć :/

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.

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...):

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

                it++;
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

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