myszka w opengl

Odpowiedz Nowy wątek
2019-05-06 19:42

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Pozostało 580 znaków

2019-05-06 19:45
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Wrocław

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, 2019-05-06 20:03
nie widzę w tym kodzie problemu z "iterator invalidation", możesz rozwinąć? - Azarien 2019-05-06 23:40

Pozostało 580 znaków

2019-05-06 20:08

Rejestracja: 17 lat temu

Ostatnio: 3 minuty temu

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++;
edytowany 5x, ostatnio: Spine, 2019-05-06 20:12
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.). - Patryk27 2019-05-06 21:04
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. - Spine 2019-05-06 22:13

Pozostało 580 znaków

2019-05-06 21:07

Rejestracja: 1 rok temu

Ostatnio: 1 miesiąc temu

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

Pozostało 580 znaków

Odpowiedz

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