Ray3D
powstał jako projekt z przedmiotu Metody i Języki Programowania. Celem naszego
projektu była implementacja „algorytmu rzucania promieni” – ang. raycasting. W specyfikacji projektu
założyliśmy jego podział na 3 części:
-edytor tekstur (podstawowe narzędzie
do tworzenia i edycji grafiki używanej dalej w wizualizacji);
-edytor mapy (edycja mapy);
-odrębna aplikacja symulacyjna,
demonstrująca działanie algorytmu;
W
trakcie prac z projektem postanowiliśmy 2 ostatnie części złączyć, takie
podejście umożliwia obserwowanie naniesionych zmian w edytorze mapy i
łatwiejszy wybór tekstur.
Edytor bitmap
Wygląd okienka edytora
tekstur.
Opis
obsługi.
Okienko
edytora tekstur zostało podzielone na dwie części tj. edycyjną i prezentacji. W
części edycyjnej zawartość można zmieniać przeciągając myszką z przyciśniętym
lewym klawiszem myszki. Rysowane są zawsze punkty bieżącym kolorem.
W menu File
dostępne są następujące funkcje:
- utworzenie
nowego dokumentu;
- odczyt pliku
w formacie *.tex (tj. własnym formacie aplikacji);
- załadowanie
pliku BMP ( do tekstury zostanie włączony początkowy kwadrat 64 x 64 pikseli)
- wyjście z aplikacji;
W menu Edit:
- undo
- cut
- copy
- paste
( działanie
tych poleceń jest typowe )
W menu
Effects:
- Set color –
zamalowuje całą teksturę bieżącym kolorem;
- Grayscale –
konwertowanie obrazka do odcieni szarości (może nie potrzebne, ale ładnie
wygląda);
- Brightness –
rozjaśnianie obrazka;
- Darkness –
przyciemnianie;
W menu View
można ukryć (albo pokazać) pasek narzędzi, pasek statusowy (Status Bar),
ewentualnie wywołać okienko dialogowe do wyboru koloru.
W menu Help
wywoływane jest okienko dialogowe o autorach.
Po uruchomieniu aplikacji okno kolor jest domyślnie ustawiany na czarny tj RGB(0,0,0). Okienko dialogowe do wyboru koloru można również wywołać dwukrotnie kliknięciem myszki w oknie aplikacji.
Informacja
Aplikacja ta działa na bazie klasy CWnd, w projekcie posłużyliśmy się kreatorem, który wygenerował klasę CChildView. Ponadto stworzyliśmy własną klasę CBitmapa przechowującą teksturę. Wszystkie metody klasy CBitmapa są dość szczegółowo opisane w plikach źródłowych, zatem nie powielamy komentarzy. Modyfikacja klasy CChildView umożliwiła nam przejęcie obsługi zdarzeń, a umieszczony w niej obiekt zadeklarowany: CBitmapa tekstura;
pozwolił na bezpośrednie wykorzystanie metod klasy CBitmapa.
Edytor mapy
Widok edytora mapy.
W lewej części widoku aplikacji znajduje się pole edycji planszy. Określamy w nim kształt wirtualnej przestrzeni gry. Klikając na poszczególne pola ustawiamy ściany. Na prawo znajduje się pole widoku tworzonej planszy. Pod nim umieszczone jest pole wyboru tekstury.
Klawiszami PageUP oraz PageDown możemy zmieniać tekstury, które chcemy nałożyć na poszczególne ściany. Jeżeli użytkownik kliknie jakikolwiek klawisz to w polu widoku planszy generowany jest obraz świata z uaktualnionej mapy.
Opis: W aplikacji stworzyliśmy dwie własne klasy tj. CRayMap, i CTextura. Głównym „silnikiem” (ang. Engine) jest funkcja ray_casting, zwraca ona wyniki w 3 tablicach:
- dist_array – długości pasków do rysownia
- bound_array – do wyboru odpowiedniego paska z tekstury
- marked_texture – do wyboru odpowiedniej tekstury
Klasa CTextura służy do do przechowywania obrazka.
W klasie CChildView umieszczona jest tablica textur i obiekt klasy CRayMap o nazwie moj_ray, na którym bazuje cała komunikacja pomiędzy klasami.
Źródła: Pliki edytora mapy są tutaj
Pliki edytora textur są tutaj
Kilka słów na koniec
Można by zrobić jeszcze wiele niewielkim kosztem… Edytor mapy nie wyposażony jest w zapis itd… Efekty w Edytorze bitmap bardzo łatwo byłoby rozwinąć… ale zabrakło czasu.
Rozwiązania, tj zmienne w klasie CRayMap można by używać przy dowolnym rozmiarze mapy, i dowolnych rozmiarach komórek.
Głównymi założeniami naszego projektu były:
-poznanie środowiska tworzenia aplikacji w Visual C++,
-generowania przestrzeni trójwymiarowej,
-ogólne zasady teksturowania skalowania oraz tworzenia i edycji map bitowych
Te założenia udało nam się zrealizować.
Głównym powodem dość wolnego działania aplikacji jest brak wykorzystania dedykowanych graficznych bibliotek (np. Direct Draw – nie chodziło o szybkość działania, ale prostotę algorytmu). Całość wyświetlania aplikacji jest oparta na jednej funkcji tj. SetPixel(). Ponadto w całej aplikacji przetwarzamy 24 bitowe kolory.
O Autorach:
Przemysław Krygier (KCE)
Gadu 1817366
Przemysław
Konopczyński (CzOlO)
Gadu 5285673