Leniwce.com | blog technologiczny
Animacje 3D (OpenGL)
Bartosz Lewandowski, 2009-07-05 01:02:22
kategoria: C#, Matlab, OpenGL

Matlab - meshgridCiekawe efekty wizualne można uzyskać naprawdę w bardzo prosty sposób. Wystarczy znaleźć funkcję matematyczną, której wizualizacja będzie wystarczająco efektowna. Postanowiłem więc się zmierzyć z tym problemem. Przedstawiony program działa wykorzystując OpenGL, współpracujący z C# dzięki bibliotece CsGL (http://csgl.sourceforge.net/).

Tym razem nie będę opisywać dokładnie co robi program. Zakładam, że czytelnik wie, czym jest OpenGL i jak go użyć. Dla osób, które nie znają OpenGLa, a chcą go poznać, polecem kurs Nehe (http://nehe.gamedev.net/). 
Jak wspomniałem na wstępie, wizualizować będę funkcję. Do mojego eksperymentu wybrałem funkcję: , gdzie zmianna „i” jest iterowana. Generalnie, całą animację tworzy właśnie zmienna „i”. 
Zanim jednak zacznę pisać projekt w C#, sprawdzę jak będzie wyglądać wykres w Matlabie. Dzięki Matlabowi, po wpisaniu kilku linijek kodu będę miał wyobrażenie o efekcie końcowym. Animację w Matlabie można utworzyć wykorzystując komendę getframe, która zapamiętuje klatki filmu. Całość kodu w Matlabie wygląda tak:

N=500;
[X,Y] = meshgrid(-8:0.5:8);
m=moviein(N); 
for i=1:N
R = sqrt(X.^(2) + Y.^2)+3+sin(i/50)*4;
Z = (sin(R)./R)*3;
surf(X,Y,Z)
m(:,i)=getframe;
grid on;
end
movie(m);
 

Dla osób, które nie mają dostępu do Matlaba, zamieszczam film, który jest efektem tego krótkiego kodu (wykres jest automatycznie skalowany po osi Z):

 

Cóż, przechodzę więc do implementacji w C#. Oprócz animacji, która jest wynikiem wspomnianej zmiennej „i” w naszej funkcji (w kodzie CS reprezentowana jest przez zmienną "rot"), dodałem jeszcze obrót całego wykresu wokół osi Y, oraz delikatną zmianę kąta, pod którym patrzę na animację. Podstawowe przekształcenia macierzowe znajdują się w funkcji glDraw, samo liczenie wartości funkcji odbywa się w funkcji CountSurface. Dodam jeszcze, że funkcja CountColor odpowiedzialna jest za określenie koloru wykresu. Im wyższa wartość funkcji w danym kroku animacji, tym kolor zbliża się ku czerwieni. 
Poniżej zamieszczam zrzut ekranu z projektu:



Pełny efekt animacji dostępny w projekcie, polecam więc jego pobranie.

Skompilowany projekt (wymagany .net framework 3.5): surface-bin.zip (106KB)
Źródła projektu (VS 2008):  surface-source.zip (137KB)


Jak widać, potrzebny jest niewielki nakład pracy, a efekt końcowy jest naprawdę interesujący. Kod źródłowy jest skomentowany, może więc służyć jako baza do kolejnych projektów wykorzystujących OpenGL oraz C#.

 

Powiązane artykuły
Atraktor Lorenza (2011-08-29)
Równoległy może więcej(?) - czyli kilka słów o Parallel.For (2011-02-06)
Święta, święta - czas pochwalić się (fraktalną) choinką (2010-12-25)
Własny wygaszacz ekranu (2010-06-03)
3.1415926535897932385... (2010-05-19)
Metody rozszerzające (2010-05-07)
GPS w lekkostrawnym sosie podany (2009-08-05)
Wszechświat na ekranie, czyli słowo o skalowaniu (2009-07-15)
OleDbConnection – Excel jako baza danych(C#) (2009-07-13)
Separator dziesiętny w C# (2009-06-29)


Komentarze


Kriss [2009-07-06 18:11:23]
Dzieki Bartek. Zawsze chcialem sie w dotnecie bawic openglem ale czasu na zaczecie nie mialem. przyda sie.
Tom [2009-10-31 15:57:25]
Matlab jest niezly.

Dodaj komentarz:
Autor:*

WWW:

Treść:*

Wprowadź kod zabezpieczający*:


        * - pola wymagane
Kategorie
C# (13)
Inne (6)
Java (3)
Matlab (1)
OpenGL (1)
PHP (2)


Najnowsze wpisy

Ostatnie komentarze