Contacts - obiekty stworzone przez Box2D do zarządzania kolizjami (zderzeniami) między dwoma fiksturami(różne fragmenty jednego ciała).



Podobne dokumenty
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wykład 5: Klasy cz. 3

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Wykład 8: klasy cz. 4

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Szablony klas, zastosowanie szablonów w programach

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Interfejsy i klasy wewnętrzne

Podstawy Programowania Obiektowego

4. Funkcje. Przykłady

Programowanie obiektowe

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Zaawansowane programowanie w języku C++ Klasy w C++

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Klasy abstrakcyjne i interfejsy

C++ Przeładowanie operatorów i wzorce w klasach

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Technologie i usługi internetowe cz. 2

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Algorytmy i Struktury Danych. Anna Paszyńska

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Biuro Podróży 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

PARADYGMATY PROGRAMOWANIA Wykład 4

Tworzenie prostej etykiety i synchronizacja etykiet z wagą. AXIS Sp. z o.o. Kod produktu:

Rozdział 4 KLASY, OBIEKTY, METODY

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Mechanizm dziedziczenia

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Algorytm SAT. Marek Zając Zabrania się rozpowszechniania całości lub fragmentów niniejszego tekstu bez podania nazwiska jego autora.

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

TEMAT : KLASY DZIEDZICZENIE

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Wstęp do Programowania 2

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Wątki w Javie. Piotr Tokarski

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe w języku

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

R o g e r A c c e s s C o n t r o l S y s t e m 5

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Język Java część 2 (przykładowa aplikacja)

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Konstruktor kopiujacy

Programowanie obiektowe i C++ dla matematyków

Aplikacje w środowisku Java

Podstawy Języka Java

Wykład 4: Klasy i Metody

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Jak Windows zarządza pamięcią?

MVVM Light Toolkit. Julita Borkowska

Programowanie obiektowe - 1.

Deklaracja struktury w C++

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Języki programowania imperatywnego

Laboratorium 7 Blog: dodawanie i edycja wpisów

Tworzenie prostej etykiety i synchronizacja etykiet z wagą. AXIS Sp. z o.o. Kod produktu:

PARADYGMATY PROGRAMOWANIA Wykład 3

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Wyjątki (exceptions)

Programowanie w języku C++

7. Pętle for. Przykłady

Pathfinder porównanie czasów ewakuacji ludzi z budynku przy użyciu dwóch metod

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

Zastosowania Robotów Mobilnych

PHP 5 język obiektowy

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

DYNAMICZNE PRZYDZIELANIE PAMIECI

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Programowanie obiektowe

UML a kod. C++, Java i C#

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie - wykład 4

Zmienne, stałe i operatory

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Transkrypt:

Kolizje (Contacts)

Contacts - obiekty stworzone przez Box2D do zarządzania kolizjami (zderzeniami) między dwoma fiksturami(różne fragmenty jednego ciała). Istnieją różne rodzaje klas (pochodzących z b2contact) do zarządzania kolizjami między różnego rodzaju fiksturami. Dla przykładu: Jedna klasa kontaktów jest do zarządzania kolizjami wielokątwielokąt a inna do zarządzania kolizjami koło-koło.

Terminologia contact point - punkt gdzie dwa ciała się dotykają contact normal - wektor jednostkowy tych punktów z jednego kształtu do drugiego. contact manifold - kontakt między dwoma wypukłymi wielokątami może generować do 2 contact point. Punkty te są grupowane w contact manifold, (w b2manifold znajdziemy liczbę punktów kolizyjnych).

normal impulse - Normalna siła jest siłą przyłożoną w punkcie kontaktu aby ochronić kształty przed przenikaniem przez siebie. Dla wygody Box2D współpracuje z impulsami. Impuls jest to normalna siła pomnożona przez krok czasowy. tangent impulse - Siła statyczna jest generowana w punkcie kontaktu aby symulować tarcie. Dla ułatwienia jest przechowywana jako impuls.

contact ids - identyfikatory kontaktów Box2D wykorzystuje contact ids aby dopasować punkty kolizji do wszystkich kroków czasowych. Identyfikatory mają cechy które pomagają odróżnić jeden punkt od drugiego. Kontakty są tworzone kiedy AABB kształtów nachodzą na siebie. Czasami filtrowanie kolizji będzie zapobiegało tworzeniu kontaktów. Kontakty są niszczone kiedy AABB przestają na siebie nachodzić. AABB wykorzystuje się ze względu na szybkość i prostotę wykonania testów na nakładanie się prostokątów na siebie - jeśli dwa prostokąty nie nakładają się na siebie oznacza to że figury wpisane w te prostokąty też nie mogą na siebie nachodzić.

AABB - obrysy prostokątne ciał

Klasa Kontaktów Klasa kontaktów jest tworzona i niszczona przez Box2D. Obiekty nie są tworzone przez użytkownika. Jednak jest on w stanie uzyskać dostęp do klasy kontaktów aby z nią współpracować. Można pobrać z niej np. punkty kontaktu, normalną kontaktu.

Dostęp do kolizji Można uzyskać dostęp do kolizji na kilka sposobów: - Bezpośrednio w Świecie i na danym ciele.(ciało - kilka fikstur połączonych razem, Świat - Klasa świata jest klasą niezbędną do stworzenia symulacji. Świat może zawierać ciała i wiązania.) Możemy odpytywać dane ciało czy uczestniczyło w kolizji. Każde ciało ma listę, w której trzyma obiekty będące w stanie kolizji z odpytywanym ciałem. Listy te są aktualizowane w każdym kroku symulacji. - Wdrażając contact listener ( nasłuchiwacz kolizji - wywołuje określoną metodę, gdy występuje kolizja)

Contact Listener Można uzyskać dane o kontaktach przez wdrożenie Nasłuchiwacza Kolizji (b2contactlistener). Obsługuje on kilka wydarzeń: początek, koniec, poprzednie rozwiązanie, następne rozwiązanie.

Wydarzenie: Początek Wywołuje się kiedy dwie fikstury zaczynają się pokrywać. Wydarzenie może występować tylko wewnątrz punktu czasowego. Wydarzenie: Koniec Następuje kiedy dwie fikstury przestają na siebie nachodzić. Może być wywołany kiedy ciała zostają zniszczone więc musi nastąpić poza krokiem czasowym.

Wydarzenie: Poprzednie rozwiązanie Wywoływane przed obliczeniami związanymi z reakcją ciał na kontakt(prędkością, odbiciem, tarciem itp.) Możemy w tym momencie ustawić różne parametry kolizji, niezależnie od cech jakie mają kolidujące ciała. (Możemy ustawić np. współczynnik odbicia, tarcia) Poprzednie rozwiązanie może być wywołane kilka razy w kroku czasowym. Wydarzenie: Następne rozwiązanie Wywoływane po obliczeniach związanych z kontaktem ciał. Pozwala nam regulować jak ciało zachowa się po kolizji (np. możemy regulować wartość impulsu.) Jest to miejsce gdzie można zebrać wyniki z kolizji impulsowych.

Korzystając z obiektu b2contactlistener mamy pełną kontrolę nad każdą fazą kolizji - od jej zasygnalizowania, przez jej trwanie, aż po jej zakończenie gdy ciała przestają być w kontakcie. Implementując własną klasę ContactListener trzeba pamiętać, aby w żadnej z metod nie niszczyć żadnych obiektów b2body, gdyż prowadzi to do błędów w odwoływaniu się do pamięci zwolnionych już obiektów, które zostają jeszcze na listach kolizyjnych.

Filtrowanie Kolizji Jeśli nie chcemy, by niektóre fikstury ze sobą kolidowały, możemy użyć filtrowania kolizji. Każda fikstura może przynależeć do jednej lub kilku kategorii (maksymalnie 16). Jeśli mamy ustawioną kategorię, możemy ustawić, czy dana fikstura ma kolidować z fiksturami z danej grupy czy nie. Jeśli na przykład chcemy, żeby A nie kolidowało z B, ale kolidowało z C; natomiast B powinno kolidować z C:

Często w grze nie chcesz, aby wszystkie obiekty się zderzały. Dla przykładu mogą być to drzwi przez które tylko niektóre postacie mogą przechodzić. To się nazywa filtrowaniem kolizji ponieważ niektóre interakcje są odfiltrowywane. Box2D pozwala osiągnąć filtrowanie kolizji poprzez zastosowanie klasy b2contactfilter. Ta klasa wymaga implementacji funkcji ShouldCollide, która pobiera dwa punkty b2shape. Twoja funkcja zwróci true jeżeli kształty powininny kolidować.

Klasa świata (World Class) Klasa b2world jest jedną z podstawowych i najważniejszych klas Box2D. Jest ona kontenerem dla obiektów, łączeń i detektorów kolizji, oraz miejscem, w którym możliwe jest zarządzanie takimi obiektami. Dzięki działaniom na obiekcie tej klasy możemy również sterować globalnymi parametrami naszej symulacji, np: b2world::setgravity(const b2vec2& gravity); oraz pobierać ich wartości/uzyskać dostęp, np: b2vec2 b2world::getgravity();

Tworzenie świata Klasa b2world posiada między innymi takie, podstawowe konstruktory: kopiujący b2world(const b2world&) z argumentem będącym wektorem grawitacji. Obiekt takiej klasy możemy stworzyć wykorzystując standardowy dla C++ sposób z operatorem new: b2vec2 gravity(0, -9.81f); b2world *world = new b2world(gravity);

Metoda Step(); Po stworzeniu obiektu świata Box2D, można już przejść do wywoływania jej najważniejszej metody: b2world::step(float timestep, int velocityiteration, int positioniteration); Wewnątrz metody wykonywana jest cała symulacja fizyczna dla elementów świata. Dobrą praktyką umożliwiającą obserwowanie zadowalających efektów symulacji jest utrzymywanie wartości kroku czasowego na jednakowym poziomie: float32 timestep = 1.0f / 60.0f;

Iteratory odpowiadają za liczbę operacji wykonywanych podczas jednego kroku czasowego, kolejno dla ostatecznych prędkości oraz pozycji ciał w danym momencie. Domyślnie argumenty te przyjmują wartości 3 i 8 iteracji. Zwiększenie tych wartości może skutkować lepszymi wynikami samej symulacji, jednak w razie problemów ze stabilnością/płynnością, w pierwszej kolejności zawsze warto najpierw zmniejszyć krok czasowy, a dopiero później zwiększać wartości iteracji. Lepiej zastosować krok czasowy 1/60 i 10 iteracji, niż 1/30 i 20.

Usuwanie obiektu świata odbywa się w analogiczny, standardowy dla języka C++ sposób, czyli poprzez zastosowanie operatora delete: delete world; Operacja ta wraz z samym obiektem niszczy również wszystkie zawarte w świecie elementy, tj: ciała, wiązania, kontakty, itp., ponieważ sam obiekt pełni między innymi funkcję kontenera dla nich. Tworzenie i niszczenie obiektów klasy b2world jest jedyną operacją korzystającą z operatorów new i delete w C++. Wszystkie pozostałe obiekty są tworzone poprzez specjalne metody obiektów wobec nich nadrzędnych. Dzięki temu ułatwione jest zarządzanie zależnościami na przykład między obiektami składowymi świata.

Parametry świata Z poziomu metod klasy b2world mamy dostęp do kilku paremetrów świata, które wedle uznania możemy zmienić. Zmiana tych ustawień w powinna mieć charakter eksperymentalny, ponieważ większość symulacji będzie wymagała wartości domyślnych, aby poprawnie funkcjonować. Wszystkie parametry zaprezentujemy podczas pracy na demie biblioteki po prezentacji.

Sleep wartość domyślna - true określa czy obiekty podczas symulacji będą mogły zasnąć, tj. czy obiekty nie przejawiające żadnej aktywności oraz takie, które nie wchodzą w interakcje z pozostałymi obiektami, będą mogły zostać pominięte w procesie obliczeń. Zastosowanie tego rozwiązania może przyspieszyć działanie programu/przebieg symulacji. Metody: void b2world::setallowsleeping(bool); bool b2world::getallowsleeping();

Warm Starting wartość domyślna - true określa czy kolejne kroki powinny wykorzystywać dane uzyskane podczas poprzednich kroków symulacji. W efekcie może to przełożyć się na dokładniejszy przebieg symulacji oraz wyniki. Metody: void b2world::setwarmstarting(bool); bool b2world::getwarmstarting();

Time of impact wartość domyślna - true określa czy symulacja powinna wykorzystywać ciągłą detekcję kolizji (CCD - Continuous Collision Detection) czy też dyskretną. Dyskretna detekcja kolizji może sprawiać, że szybko poruszające się ciała będą się całkowicie mijać, a same kolizje mogą być niewykrywalne. Metody: void b2world::setcontinuousphysics(bool); bool b2world::getcontinuousphysics();

Przykładowe działania na obiektach świata Mając stworzony obiekt świata możemy rozpocząć pracę nad jej własnościami oraz samą zawartością. Jako że b2world jest kontenerem dla innych obiektów, jednym z naszych celów może być wykonanie mniej lub bardziej skomplikowanego działania na każdym z podrzędnych elementów świata. Na przykład: for (b2body* b = myworld->getbodylist(); b; b->getnext()) { b->setawake(true); }

Innym przykładem takiego działania jest wysyłanie zapytań dotyczących kolizji obiektów lub też ich AABB. Dzięki implementacji poniższego kodu możemy znaleźć wszystkie fikstury, które potencjalnie nakładają się z tymi, które ustaliliśmy na sztywno oraz wybudzić obiekty, których są częścią. class MyQueryCallback : public b2querycallback { public: bool ReportFixture(b2Fixture* fixture) { b2body* body = fixture->getbody(); body->setawake(true); // Return true to continue the query. return true; } };

dalszy ciąg: MyQueryCallback callback; b2aabb aabb; aabb.lowerbound.set(-1.0f, -1.0f); aabb.upperbound.set(1.0f, 1.0f); myworld->query(&callback, aabb);

Dane użytkownika W pracy nad projektami w Box2D przydatne może okazać się przekazanie wskaźników do pól klas takich jak b2fixture, b2body czy b2joint. Dzięki analizie tych informacji, możemy dotrzeć do tego jak konkretne obiekty mają oddziaływać z innymi. Na przykład wskaźnik do struktury zawarty w userdata jakiejś fikstury może prowadzić nas do informacji o materiale danej powierzchni albo efektach jakim ma ulegać w danych przypadkach.

Konkretny przykład: możemy chcieć podłączyć wskaźnik do obiektu typu GameActor do jakiegoś ciała wewnątrz świata gry. GameActor* actor = GameCreateActor(); b2bodydef bodydef; bodydef.userdata = actor; actor->body = box2dworld->createbody(&bodydef); Tego typu operacje mogą okazać się przydatne kiedy: actor ma odnieść obrażenia po obsłużeniu kolizji z innym obiektem chcemy oskryptować zdarzenie w konkretnym miejscu świata gry, np. tuż po wejściu postaci do pomieszczenia (czyli wtedy, kiedy jego AABB zacznie kolidować z AABB pomieszczenia/triggera)

Ograniczenia Box2D W oficjalnej dokumentacji dotyczącej biblioteki można przeczytać o kilku ograniczeniach, z którymi musi liczyć się twórca oprogramowania opartego o Box2D. brakuje stabilnej obsługi kontaktów wśród obiektów o dużej różnicy wagi - kiedy waga jednego jest 10-krotnie większa od drugiego łańcuch łączeń (joints) może zostać wydłużony, jeżeli obsługuje ciała znacząco różniące się od siebie masą kolizje shape versus shape mogą nie być dokładne i pozostawiać luki o wielkości 0,5 cm tryb ciągłych kolizji nie wspiera łączeń, dlatego można zaobserwować wydłużanie się ich pod wpływem prędkości poruszających się obiektów