Záznam procházky ve VRML

Semestrální práce do předmětu MUS

Řešitel: Pavel Halabala (e-mail: halabap@fel.cvut.cz)

Konzultant: Petr Adámek (e-mail: petr.adamek@antek.cz)

Zadání

Do existujícího prohlížeče statických světů VRML s názvem GOAL naprogramujte modul, který umožní záznam poloh uživatele při procházce virtuálním světem. Navrhněte a implementujte jednoduchý editor této procházky tak, aby ji bylo možno znovu interpretovat a off-line vygenerovat řadu obrázků virtuálního světa na disk. Tyto obrázky pak zkonvertujte do souboru MPEG.

Postup řešení

TýdenPopis činnostiZpráva
2.-3.Orientace v dodaném kódu, průzkum částí potřebných pro implementaci úlohyZpráva
4.-5.Implementace ukládání a přehrávání průchodu scénouZpráva
6.-7.Ukládání průchodu scénou do MPEGuZpráva
8.-9.Tvorba dialogu pro řízení komprese do MPEGZpráva
10.-11.Editace procházky v prohlížečiZpráva
12.-13.Závěrečné testování, odevzdáníDokumentace

Zpráva ze 2. a 3. týdne

Datum poslední ústní konzultace: 11. 3. 2003

Překlad

Dostal jsem k dispozici zdrojové kódy VRML prohlížeče GOAL. Program je určen pro systém Windows. Pracuji v prostředí Visual C++ verze 6.0 s překladačem od firmy Microsoft. Prvním úkolem bylo obstarat vše potřebné pro přeložení (knihovny flex a bison, kód knihovny ALIB). Překlad funguje bez problémů v Debug i Release verzi.

Průzkum prohlížeče

Vyzkoušel jsem prohlížeč na několika scénách. Zaměřil jsem se na funkce, které budu využívat ve své úloze. Narazil jsem na drobné problémy s exportem pohledu na scénu do obrázku. Export bude potřeba pro ukládání sekvence nasnímaných obrázků do formátu MPEG. U obou podporovaných formátů (bmp a jpg) nefunguje na mém počítači správně. Výsledný obrázek je totiž vždy bíly, ale jeho velikost souhlasí. Mohlo by to být způsobené verzí OpenGL, protože na ostatních počítačích je vše bez problémů. Tento nedostatek bude třeba dořešit.



Ukázka prohlížeče GOAL

Průzkum kódu

Zorientoval jsem se v částech kódu souvisejících s mojí úlohou.

Hledání knihovny pro ukládání do MPEG

Našel jsem free knihovnu FAME pro kompresi videa do formátu MPEG. Jako vstup se předkládájí framy ve formátu YUV. Rozhraní knihovny vypadá velmi jednoduše. Podporuje základní nastavení jako jsou rychlost, poměr a kvalita komprese. Jediným nedostatkem je poněkud strohá dokumentace.

Odkaz: http://fame.sourceforge.net/libfame/overview/

Zpráva ze 4. a 5. týdne

Datum poslední ústní konzultace: 11. 3. 2003

Implementace ukládání a přehrávání průchodu scénou

Vytvořil jsem mechanizmus pro zaznamenávání průchodu scénou. Do paměti se ukládají 4 transformační matice, ze kterých se počítá poloha pozorovatele při vykreslování. Jemnost takto navzorkovaného pohybu závisí pouze na aktuální rychlosti zobrazování (počet snímku za sekundu) a během průchodu scénou není ekvidistantní, proto je nutné zaznamenávat také čas, při kterém k pohybu došlo. Zaznamenanou sekvenci je možno znovu přehrát. Editace zatím není možná.

Průzkum knihovny pro ukládání do MPEGu

Díky úžasné jednoduchosti rozhraní knihovny FAME jsem se rozhodl ji trochu otestovat. Je to knihovna vyvíjená pod veřejnou GNU licencí, což automaticky umožňuje nasazení v programu GOAL. Hlavním důvodem jejího vytvoření bylo umožnit komprimaci videa do MPEGu v reálném čase. Tuto možnost sice v GOALu nevyužijeme, protože vyrenderovat obecnou scénu rychlostí 25 snímků za sekundu a současně zkomprimovat do MPEGu by bylo nad rámec možností současných počítačů. Nesporná výhoda ale spočívá v proudovém zpracování vstupních (obrázek) a výstupních (video) dat, protože není nutné mít v jednom okamžiku v paměti všechny snímky. Naopak nevýhodou je, že knihovna zatím nepodporuje B-snímky, které nejvíce spoří velikost výsledné vidoesekvence. V současnosti je podporován formát MPEG-4.

Pro pochopení rozhraní bylo přece jen nutné prostudovat si něco o formátech MPEG-1,2,4. Zde je několik odkazů:

Na vstupu funkcí pro kompresi videa se předpokládají obrázky v barevném modelu YUV12 (neboli YUV 4:2:0). Způsob konverze z RGB do YUV není příliš složitý a je dán příslušnou transformační maticí. Formát YUV12 ale vyžaduje oproti prostému YUV podvzorkované (subsampled) chrominanční složky U a V. Podvzorkováním se objem dat, kterým přispívají tyto složky, zkrátí na čtvrtinu a dojde ke ztrátě informace. Proto je nutné použít vhodný algoritmus, který přiliš nezhorší barevnou kvalitu videa.

Nejprve jsem si napsal testovací program, který vytvoří krátkou videosekvenci s použitím knihovny FAME. Po malých problémech s barvami (černá byla ve výsledku tmavězelená a bílá světlezelená) se mi podařilo vše odladit. Vygenerovanou videosekvenci se mi podařilo bez problémů přehrát v různých přehrávačích (WM player, Micro DVD player, Quicktime, atd.) Po úspěšném otestování jsem si vytvořil třídu CMpegEncoder pro snadnější "zacházení" s knihovnou FAME, kterou bych chtěl posléze použít v GOALu. Zde je její zdrojový kód. Zjistil jsem, že konverze z RGB do YUV12 trvá přibližně stejnou dobu jako samotná komprese do MPEGu, a to i přes její optimalizaci (viz kód). Je to asi tím, že nelze použít funkce pro práci s bloky paměti a každý pixel se musí převádět samostatně.

Zpráva ze 6. a 7. týdne

Ukládání průchodu scénou na disk do formátu MPEG

Program GOAL již má zatím velmi omezené ovládací prvky pro přehrávání průchodu VRML scénou. Nyní je konečně možné uložit celý průchod na disk ve formátu MPEG. Pro kódování obrazu do MPEGu jsem použil knihovnu FAME, resp. její objektovou nadstavbu, kterou jsem vyrobil v rámci dosavadních prací na projektu. Jako vstup předkládám obrazové informace získané uložením úseku videopaměti do formátu BMP při simulovaném průchodu scénou. Protože BMP formát je kódován jako posloupnost řádků směrem zdola nahoru a navíc pořadí barevných složek v pixelu je obrácené (ne RGB, ale BGR), bylo ještě nutné dovyrobit funkci pro převod do formátu YUV ve správném pořadí. Převod zatím funguje pouze pro 24-bitovou hloubku obrazu. Jako důkaz jsem vyrobil krátkou videosekvenci (280 KB) zaznamenanou v GOALu.

Průběh dalších prací bych viděl následovně:

Zpráva z 8. a 9. týdne

Tvorba dialogu pro řízení komprese do MPEG

Vytvořil jsem dialog pro nastavení základních parametrů MPEGu (viz obrázek níže)



Okno pro kompresi do MPEGu

Jak je patrno z obrázku, je zde možnost vytvořit též videosekvenci pouze v odstínech šedi. Díky tomu lze ušetřit:

Provedl jsem také několik optimalizací převodu RGB->YUV, např. použití celočíselné aritmetiky pro veškeré výpočty, použití bitových operací pro dělení/násobení mocninami dvou, atd.

Zpráva z 10. a 11. týdne

Rozšířil jsem Goal o možnost editace zaznamenané procházky. Vytvořil jsem následující panel nástrojů:


Panel nástrojů poskytuje následující funkce: (zleva)
  1. Ukládání průchodu scénou. Pokud byl již předtím uložen nějaký průchod, naváže se na něj v místě, na které se uživatel v záznamu posunul a zbytek předchozího záznamu se smaže.
  2. Smazání začátku záznamu až po aktuální polohu.
  3. Smazání jednoho záznamu daném aktuální polohou.
  4. Smazání celého záznamu
  5. Přehrání průchodu od aktuální polohy. (nebo od začátku pokud je aktální poloha na poslením záznamu)
  6. Zastavení přehrávání. Aktuální poloha je nastavena na místo přerušení.
  7. Zastavení přehrávání. Aktuální poloha je nastavena na počátek záznamu.
  8. Přesun na začátek záznamu.
  9. Přesun na předcházející záznam.
  10. Přesun na následující záznam.
  11. Přesun na konec záznamu.