Aby wygodnie tworzyæ bry³y 3D trzeba skorzystaæ z trójwymiarowego
uk³adu wspó³rzêdnych x, y i z. Jest tylko jeden problem: aby wy¶wietliæ
obraz na ekranie potrzeba jedynie dwóch wspó³rzêdnych x i y. Istniej±
jednak wzory, które pozwalaj± przekszta³ciæ wspó³rzêdne 3d na 2d tworz±c
perspektywiczny efekt 3d na dwuwymiarowym ekranie.
x2d = 256 * x3d / (z3d + dist) + 160
y2d = 256 * y3d / (z3d + dist) + 100
gdzie:
x2d,y2d - wspó³rzêdne dwuwymiarowe
x3d,y3d,z3d - wpó³rzêdne trójwymiarowe
dist - odleg³o¶æ od obserwatora
przydadz± siê tak¿e wzory na obrót:
wokó³ osi OX:
Yn = y*cos(k±t) - z*sin(k±t)
Zn = y*sin(k±t) + z*cos(k±t)
wokó³ osi OY:
Xn = x*cos(k±t) - z*sin(k±t)
Zn = x*sin(k±t) + z*cos(k±t)
Wokó³ osi OZ:
Xn = x*cos(k±t) - y*sin(k±t)
Yn = x*sin(k±t) + y*cos(k±t)
Gdzie:
Xn,Yn,Zn - nowe wspó³rzêdne
x,y,z - stare wspó³rzêdne
Tworz±c animacje warto jeszcze zwróciæ uwagê na jeden fakt. Rysuj±c
kolejne klatki musisz usuwaæ poprzedni obraz. "Zmazywanie"
poprzedniej klatki jest równie czasoch³onne jak rysowanie nastêpnej.
Jak siê z tym uporaæ? Otó¿ ja stosujê prost± metodê. Zamiast wpisywaæ
dane obrazu do pamiêci karty graficznej zapisuje je gdzie¶ do pamiêci
RAM. Kiedy ju¿ ca³y obraz jest w pamiêci RAM, kopiujê go do pamiêci
karty, a nastêpnie czyszczê ten fragment pamiêci RAM. W ten sposób
nastêpn± klatkê rysujê jakgdyby na pustym ekranie. Poni¿szy schemat
powinien rozwiaæ wszelkie w±tpliwo¶ci.
pêtla:
zmieñ dane obrazu -> (to ma byæ animacja)
zapisz dane o kolorach poszczegolnych pixeli w pamiêci RAM
kopiuj zawarto¶æ RAM do pamiêci karty
wyczy¶æ zawarto¶æ RAM
powróæ do pocz±tku (i tak w kó³ko).