Úloha 075: Animace pomocí polygonů

Vymyslete a implementujte animaci v rovině nebo prostoru kreslenou pouze pomocí rovinných mnohoúhelníků. Animace musí být počítána po jednotlivých snímcích ("off-line rendering"), nakonec vyrobíte video-soubor např. programem ffmpeg.

Základ

Jako základ poslouží projekt 075animation z repository grcis. Je připravena jednoduchá aplikace, která umí opakovaně pouštět vaši metodu Animation.DrawFrame() a výsledky zapisovat do jednotlivých PNG souborů. Výpočet se provádí v separátním vlákně, takže jej lze v případě potřeby zastavit tlačítkem Stop.

Náměty

Pohyb nebo změna tvarů v rovině, 3D efekt byste museli sami napodobit kreslením "odzadu-dopředu" (tzv. malířův algoritmus). Fantazii se meze nekladou, pouze musíte snímky animace kompletně nakreslit vaším programem a pomocí omezených prostředků třídy Canvas (jen vybarvované polygony, viz níže). To znamená, že mi odevzdáte zdrojový soubor, ze kterého půjde bez použití dalších nástrojů (až na encoding videa nebo doplnění zvukové stopy) animaci vyrobit.

Canvas

Výstup musíte realizovat přes danou třídu Canvas, která má k dispozici následující API:

  • int Width - šířka obrazu v pixelech, do kterého máte kreslit (je možné modifikovat a pak zavolat Clear()).
  • int Height - výška obrazu v pixelech, do kterého máte kreslit (je možné modifikovat a pak zavolat Clear()).
  • Clear ( Color bg ) - inicializuje obrázek, nastaví barvu pozadí bg.
  • SetColor ( Color col ) - nastaví pro vyplňování danou barvu.
  • SetAntiAlias ( bool aa ) - nastaví, zda se má používat anti-aliasing.
  • FillRectangle ( float cx, float cy, float w, float h ) - vybarví obdélník se středem [cx,cy], rozměry w x h a aktuálně nastavenou barvou.
  • FillRectangle ( float cx, float cy, float w, float h, float angle ) - vybarví obdélník se středem [cx,cy], rozměry w x h a nakloněný o úhel angle (ve stupních CCW).
  • FillPolygon ( float[] v ) - vyplní polygon zadaný uzavřenou lomenou čárou, souřadnice x a y se v poli střídají [x0, y0, x1, y1, x2, y2, ..].

Technicky

Metoda Animation.DrawFrame() dostane údaje o čase (viz pilotní implementaci) a referenci na kreslicí objekt Canvas. Metoda má přes něj k dispozici i údaje určující velikost snímku.

Nemůžete předpokládat nic o pořadí vykreslování jednotlivých snímků animace. Jednotlivá vlákna výpočtu mohou kreslit snímky v libovolném pořadí. Na začátku výpočtu animace (anebo před jednotlivým snímkem) se spouští vaše metoda Animation.Init(), do ní můžete dát případnou inicializaci globálních sdílených dat, apod.

Výroba video-souboru

Viz např. tento návod. Binárku ffmpeg pro Windows si můžete stáhnout např. zde. Vytvořené video někde vystavte nebo nahrajte na YouTube a pošlete mi na něj odkaz. Nezapomeňte přiložit i zdrojový soubor Animation.cs.

Termín

Odevzdat do: 3. 1. 2015

Body

Základ: 5 až 20 bodů podle zajímavosti a obtížnosti
Bonus: za výjimečné řešení

Projekt

Visual Studio 2010 projekt: 075animation

Zdrojový soubor

Modifikujte a odevzdejte soubor: Animation.cs
Do komentáře na první řádce napište své jméno!
Nezapomeňte poslat odkaz na výsledné video.

Soutěž

Hlasujte na stránce soutěže, do 18. 1. 2015.


Copyright (C) 2010-2015 J.Pelikán, last change: 2020-12-08 00:57:30 +0100 (Tue, 08 Dec 2020)