piątek, 22 października 2010

[WPF 3D] Rysowanie linii, to nie taka banalna sprawa [PL]

Jednym z problemów, na jakie może napotkać programista tworzący trójwymiarową scenę przy pomocy WPF 3D, jest rysowanie linii. W tym artykule zostanie opisane, dlaczego taki problem może zaistnieć i jak go można rozwiązać.
Niniejszy wpis poza prezentacją różnych i niezależnych od konkretnego wykorzystania treści stanowi również opis pewnych zagadnień związanych z projektem Mesh Diagram 3D.Informacje dotyczące projektu oznaczone są etykietą MeshDiagram3D.
Dla każdego, kto zajmował się w jakimkolwiek stopniu grafiką rysowanie linii, czy punktów mogłoby się wydawać czynnością wręcz podstawową. Niestety w WPF 3D wcale to nie jest „takie podstawowe”. Tak jak już pisałem wcześniej (patrz artykuły:„Światło, ... kamera, ... trójkąt” i „Czworościan, sześcian ... itd. z poziomu C#”), podstawowym elementem sceny WPF 3D są trójkąty i każdy element w tym linia, czy punkt musi składać się z trójkątów. Mogłoby się wydawać, że to nie jest bardzo trudne, przecież linia, to tak naprawdę „cienki” prostokąt, czyli wystarczy go stworzyć z dwóch trójkątów. Jest jednak pewne „ale”. Ten „cienki” prostokąt należy jeszcze obrócić, by był przodem do kamery! Dodatkowo (aby nie było za łatwo :) ), należy jeszcze zdecydować, kiedy, w jaki sposób i na podstawie jakich informacji ten prostokąt obracać. Zastanówmy się, jakie mogą być odpowiedzi na te pytania.

Kiedy obracać prostokąt?

Jeżeli chodzi o decyzję, kiedy obracać prostokąt, to możliwości są przynajmniej dwie:
  • Na żądanie – w tej metodzie to my (programiści tworzący scenę) decydujemy i jesteśmy odpowiedzialni za odpowiednie wysłanie żądania obrócenia obiektów.
  • Automatycznie - np. w momencie renderowania sceny na ekranie. Można do tego wykorzystać klasę CompositionTarget, która reprezentuje powierzchnię aplikacji WPF. Posiada ona zdarzenie Rendering, które ma miejsce za każdym razem, gdy powierzchnia aplikacji jest renderowana (odrysowywana). Zdarzenie ma dużą częstotliwość (może ono mieć miejsce nawet 60 razy na sekundę), przez co wykonywanie operacji w ramach tego zdarzenia może być bardzo obciążające dla procesora.

Na podstawie jakich informacji obracać prostokąt?

Oczywiście prostokąt należy obracać na podstawie informacji dotyczących kamery, a dokładniej:
  • od położenia kamery,
  • od kierunku (wektora) patrzenia kamery,
  • od transformacji przypisanej do kamery.
Informacje odnośnie kamery można pobrać, np. przy pomocy opisanego w artykule: „Wizualne drzewo w WPF (visual tree) a elementy w scenie 3D”.

W jaki sposób obracać prostokąt?

Wydaje się, że najlepiej obracać prostokąt przy pomocy transformacji i operacji na nich, wbudowanych we framework WPF.

CDN ...

Literatura

Polecam również przeczytać artykuł Erika Sink'a, pt. "Performance issues with ScreenSpaceLines3D", dostępnego pod adresem: http://www.ericsink.com/wpf3d/1_ScreenSpaceLines3D_Performance.html.
Promuj

3 komentarze:

Posty powiązane / Related posts