Politechnika Wrocławska Instytut Informatyki Automatyki i Robotyki Wizualizacja danych sensorycznych Wizualizacja płomienia Autor: Weronika Matlakiewicz Opiekun projektu: dr inż. Bogdan Kreczmer 4 czerwca 2010
SPIS TREŚCI SPIS TREŚCI Spis treści 1 Charakterystyka tematu projektu 2 2 Opis problemu 2 3 Funkcjonalność aplikacji 2 3.1 Tworzenie płomienia........................................... 2 3.2 Proces inicjacji.............................................. 2 3.3 Proces animacji.............................................. 3 4 Interfejs graficzny 3 5 Diagram klas 4 6 Diagram przepływu sterowania 4 7 Efekty pracy 4 7.1 Suwak................................................... 4 7.2 Przycisk Dmuchnij........................................... 4 7.3 Przycisk Rozprosz............................................ 5 7.4 Pola wyboru............................................... 5 8 Wnioski i podsumowanie 5 1
3 FUNKCJONALNOŚĆ APLIKACJI 1 Charakterystyka tematu projektu Celem projektu było stworzenie aplikacji przedstawiającej wizualizację płomienia, posiadającej graficzny interfejs użytkownika, który pozwala wpływać na zachowanie aplikacji. 2 Opis problemu Pierwszym istotnym elementem projektu był wybór programu wspomagającego tworzenie takich aplikacji. Po zapoznaniu się z różnymi programami i bibliotekami umożliwiającymi tworzenie animacji i wizualizacji, do realizacji projektu wybrano program QT4 wraz z biblioteką QGLViewer. Następnie należało opracować sposób realizacji płomienia. 3 Funkcjonalność aplikacji Aplikacja pozwala na oglądanie symulacji ognia. Panel administracyjny graficznego interfejsu użytkownika umożliwia zmianę wysokości płomienia, symulację działania podmuchu oraz rozproszenie ognia. Ponadto pozwala również wyświetlać dodatki do widoku w postaci siatki, osi X, Y, Z, oraz wskazania częstotliwości. Wszystkie te funkcje zostały opisane w rozdziale 7. 3.1 Tworzenie płomienia W projekcie przyjęto koncepcję płomienia złożonego z pojedynczych cząsteczek. Każda cząsteczka rodzi się w źródle ogniska, a następnie, aż do osiągnięcia wieku maksymalnego, jest animowana. Po śmierci cząsteczki jej miejsce zastepuje nowa, rodząca się w źródle. Aby jak najdokładniej odwzorować wygląd ognia założono, że będzie się on składał z głównego płomienia (składającego się z 3/4 wszystkich cząstecezek)o stałym położeniu źródła oraz z ognika, którego źródło jest mniejsze i porusza się wewnątrz głównego źródła. Współrzędne obydwu źródeł opisane są wzorami: x = norm cos(angle), y = norm sin(angle), z = param norm 2, gdzie paramater norm jest losowany z zakresów < 0; 0.1 > dla głównego ognia i < 0; 0.05 > dla ognika, natomiast parametr angle, dla obydwu źródeł, jest losowym kątem z zakresu < 0; 2π >. Parametr param dla głównego źródła wynosi 6.0, a dla ognika 3.0. 3.2 Proces inicjacji Podczas tworzenia cząsteczki następuje przypisanie jej wartości zmiennej wewn, od której zależy, czy będzie ona należała do głównego płomienia, czy do wewnętrznego ognika. Następnie, podczas wywołania funkcji Particle::init(), nastepuje określenie pozycji startowej każdej cząsteczki, z uwzględnieniem jej stanu zmiennej wewn. Cząsteczki płomienia głównego rodzą się w źródle głównym zaczepionym w początku układu współrzędnych, natomiast cząsteczki ognika rodzą się w źródle wewnętrznym poruszającym się zgodnie z równaniami: gdzie: dx = n cos(ϕ), dy = n sin(ϕ), dz = 3n 2, ϕ+ = współczynnik * rand()/rand MAX, n+ = V t + (a+a1)( t)2 2, V + = (a + a 1 ) t, a = n - moc przyciągania, a 1 = rand()/rand MAX - moc uciekania. 2
3.3 Proces animacji 4 INTERFEJS GRAFICZNY 3.3 Proces animacji Najważniejszą z napisanych funkcji jest Particle::animate(), ponieważ to ona odpowiada za animowanie ruchu cząsteczek. Pierwsza część funkcji obejmuje proces zmiany składowych prędkości cząsteczki, natomiast do drugiej części należy wyliczenie nowej pozycji elementu. Proces zmiany prędkości podzielony jest na trzy przypadki: normalny - kiedy żaden z przycisków nie jest aktywny, dmuchniecia - kiedy aktywny jest przycisk Dmuchnij, rozproszenia - kiedy aktywny jest przycisk Rozprosz. W przypadku normalnym, w każdym wywołaniu funkcji animate() zwiększana jest pionowa prędkość cząsteczki (składowa z). Każda cząsteczka otrzymuje również prędkości poziome (składowe x i y). w zależności od tego czy dana cząsteczka należy do głównego płomienia czy wewnętrznego ognika wartości te różnią się (ognik musi być węższy i dłuższy). Następnie losowo wybrane cząsteczki mogą otrzymać dużo większą prędkość pionową lub odznaczenie zmiennej losowa. w momencie, gdy któraś z cząsteczek posiada niezerową wartość zmiennej losowa w każdym wywołaniu funkcji animate() przyrost jej prędkość pionowej jest zmniejszany, natomiast zwiększane są prędkości poziome. Podczas gdy aktywny jest tryb dmuchnięcia do trybu normalnego dodane jest sukcesywne zmniejszanie prędkości pionowej i zwiększanie poziomej na różnych wysokościach płomienia. W przypadku rozproszenia funkcja animate() przestaje modyfikować składowe prędkości cząsteczki, dlatego jedyną prędkością jaka pozostaje jest prędkość inicjacyjna. 4 Interfejs graficzny Interfejs graficzny składa się z dwóch okien, głównego okna aplikacji oraz okna pomocy wywoływanego przy pomocy klawisza H. Okno główne (rys.1) składa się z dwóch części: pola animacji, wewnątrz którego można przy pomocy myszy sterować kamerą, panelu administracyjnego, który pozwala użytkownikowi wpływać na zachowanie animacji. Okno pomocy (rys.2) składa się z trzech zakładek: Rysunek 1: Okno główne. 3
7 EFEKTY PRACY opisu projektu, tabeli objaśniającej skróty klawiaturowe, tabeli sprzedstawiającej możliwości sterowania oknem przy pomocy myszy. Rysunek 2: Okno pomocy 5 Diagram klas Diagram klas wykonano w programie Software Ideas Modeler i przedstawiono na rysunku 3. 6 Diagram przepływu sterowania Diagram przepływu sterowania również wykonano w programie Software Ideas Modeler i przedstawiono na rysunku 4. 7 Efekty pracy Możliwości aplikacji najlepiej przedstawiają rysunki ilustrujące wpływ elementów panelu administracyjnego na okno animacji. 7.1 Suwak Suwak umieszczony w części panelu administracyjnego pozwala na zmianę wysokości płomienia, co przedstawiono na rysunku 5. 7.2 Przycisk Dmuchnij Przycisk pozwala na zasymulowanie strumienia wiatru skierowanego na płomień. Podmuch jest aktywny do momentu ponownego wciśnięcia przycisku. Rysunek 6 przedstawia wywołanie opisanej akcji. 4
7.3 Przycisk Rozprosz 8 WNIOSKI I PODSUMOWANIE Rysunek 3: Diagram klas w języku UML. 7.3 Przycisk Rozprosz Przycisk pozwala na zasymulowanie wybuchu płomienia, pozostawiającego jedynie tlącą się podstawę. Podobnie jak w przypadku przycisku Dmuchnij pierwsze wciśnięcie uruchamia akcję, natomiast kolejne ją wyłącza. Rysunek 7 obrazuje wywołanie opisanej akcji. 7.4 Pola wyboru Zaznaczenie każdego z dostępnych pól wyboru powoduje wywołanie jednej z akcji dostępnych w klasie QGLViewer. Dodatkowo włączenie którejś z tych akcji przy pomocy klawiatury, powoduje odznaczenie odpowiedniego pola wyboru. Dostępne pola wyboru to: FPS - wyświetla częstotliwość animacji, Grid - rysuje siatkę w płaszczyźnie XY, Axis - rysuje osie X,Y oraz Z. Wynik zaznaczenia dostępnych pól wyboru przedstawia rysunek 8. 8 Wnioski i podsumowanie Na rynku istnieje bardzo dużo programów służących do tworzenia wizualizacji i animacji zarówno dwu- jak i trójwymiarowych. Wybór jednego z nich, odpowiedniego do zrealizowania projektu, okazał się być najtrudniejszym zadaniem projektowym. Warto jednak było poświęcić więcej czasu na dobór środowiska pracy, ponieważ odpowiednie oprogramowanie pozwoliło na sprawne zrealizowanie pozostałych punktów harmonogramu, czyli stworzenie 5
8 WNIOSKI I PODSUMOWANIE Rysunek 4: Diagram przepływu sterowania dla aplikacji. głównego elementu projektu - aplikacji. Praca z biblioteką QGLViewer daje ogromne możliwości w zakresie tworzenia obrazów i animacji trójwymiarowych. Ze względu na bardzo dużą liczbę funkcji dostępnych w klasach tej biblioteki początkowa faza tworzenia własnej aplikacji przysparza wielu problemów, jednak jest to zrekompensowane dostępnymi przykładami, których kod pozwala na szybsze rozeznanie się w możliwościach biblioteki. Inaczej jest w przypadku programu QT4 Designer, który już po krótkim wprowadzeniu pozwala na szybkie i sprawne tworzenie graficznych interfejsów użytkownika. 6
8 WNIOSKI I PODSUMOWANIE Rysunek 5: Ilustracja działania suwaka. Rysunek 6: Akcja spowodowana naciśnięciem przycisku Dmuchnij. 7
8 WNIOSKI I PODSUMOWANIE Rysunek 7: Akcja spowodowana naciśnięciem przycisku Rozprosz. Rysunek 8: Ilustracja działania pól wyboru. 8