Tworzenie gry w C# z użyciem silnika Ogre - cz.3
10.10.2010 - Mateusz Osowski
Etykiety 3DKolejnym usprawnieniem silnika, którego dokonamy będzie wprowadzanie etykiet 3D. Nowa klasa będzie dziedziczyć z istniejącej już klasyTextLabel . Wzbogacimy ją o atrybut pozycji w przestrzeni 3D.
Pole Position3D będzie publicznym polem przechowującym właściwą pozycję etykiety. W polu HalfWidth przechowywać będziemy połowę szerokości napisu. Będzie to nam potrzebne do wyśrodkowania napisu względem zadanej pozycji. Konstruktor nowej klasy niczym się nie różni od konstruktora bazowej klasy TextLabel , toteż jego ciało pozostawiamy puste.
Ponieważ etykieta jest w istocie obiektem znajdującym się w dwuwymiarowej przestrzeni ekranu, w każdej klatce musimy odwzorować jej pozycję w przestrzeni 3D na punkt na ekranie. Wykorzystujemy do tego celu macierze widoku i projekcji kamery, których silnik używa do renderowania wszelkich obiektów trójwymiarowych. Macierz widoku ( ViewMatrix ) przekształci punkt 3D zgodnie z transformacją kamery, a macierz projekcji zamknie jego współrzędne w przedziale ostrosłupa widzenia. Zagadnienie transformacji 3D jest dobrze wyjaśnione w wielu artykułach, które można znaleźć w sieci, a także na tym portalu.http://www.informatyka.wroc.pl/node/619?page=0,1 Po obliczeniu pozycji punktu w ostrosłupie widzenia musimy je przeskalować (5-6), by uzyskać współrzędne ekranowe. Ponadto pamiętając, że w przestrzeni ekranu oś Y jest skierowana w dół, a nie w górę, jak to ma miejsce w przestrzeni 3D silnika Ogre, odwracamy współrzędną Y (6). Następnie, w przypadku gdy tekst nie znajduje się na ekranie ukrywamy go zwalniając kartę graficzną z jego renderowania. Ustawiając pozycję napisu przesuwamy go o połowę jego szerokość w lewo, dzięki czemu uzyskujemy efekt wyśrodkowania. W przypadku zmiany etykiety przeliczamy połowę szerokości napisu za pomocą metody GetTextWidth() , którą zaimplementujemy w klasie TextLabel .
Zaimplementujemy teraz metodę GetTextWidth() w klasie TextLabel :
Metoda nie jest skomplikowana - po pobraniu czcionki za pośrednictwem menadżera czcionek silnika Ogre iterujemy po literach etykiety sumując współczynniki szerokość/wysokość kolejnych znaków. Sumę tą mnożymy przez wielkość znaku uzyskując tym samym interesującą nas wartość. Szerokość musi zostać przeskalowana przez odwrotność współczynnika proporcji ekranu, ponieważ w układzie współrzędnych ekranowych obszar ekranu jest kwadratem, podczas gdy w rzeczywistości tak być nie musi. Dodajmy możliwość utworzenia obiektu klasy TextLabel3D poprzez fabrykę:
Metoda wygląda niemalże identycznie jak w przypadku zwykłej etykiety. Możemy teraz dodać przykładową etykietę do programu:
Jak widać, użycie nowej klasy jest bardzo proste. W efekcie, nad głową postaci gracza powinien znajdować się odpowiedni napis. Aktualny kod źródłowy(3 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com