V prvním tutorialu jste se měli možnost seznamit s omáčkou kolem práce s pv3d, vybrat si vhodné nástroje a seznámit se s vhodnými idoly. Dnes se vrhneme rovnou do nestojatých vod virtualního světa pv3d jakoby se Flash 10 nechumelil a zobrazíme svou první “Hello world!” krychli.
Setup FLEXu
Otevřete si FLEX a založte si nový ActionScript Project. V prvním dialogovém okně vyplňte jméno, umístění projektu a klikněte na Next (ne horkokrevně na Finish). V dalším okně máte možnost nasměrovat FLEX na složku, do které jste si umístili vaší working copy z SVN repozitáře papervision (tedy její src složku, pokud jste si exportovali vše i s dokumentací). Klikněte na Add folder a směle tak učiňte. Nyní již jen Finish a FLEX vás víta s prvním předpřipraveným kódem. Můj projekt jsem pojmenoval _pv3d_01 takže úvodní obrazovka vypadá nějak takhle.
package {
import flash.display.Sprite;
public class _pv3d_01 extends Sprite
{
public function _pv3d_01()
{
}
}
}
Setup PV3D, krychle na scénu!
Pro inicializaci pv3d dnes již potřebujeme pouze BasicView, které nám připraví základní scénu samu. Deklarujeme si tedy veřejnou proměnnou view jakožto BasicView. Chystáme se vyrábět krychli, deklarujme si tedy proměnnou krychle jakožto Cube. Poslední předpřípravou je deklarace materialu, tedy povrchu naší krychle. Do startu nám postačí ColorMaterial, tedy jednobarevná plocha. Jelikož pv3d umí hravě zobrazit na každé straně krychle něco jiného budeme k ní muset ještě nadefinovat seznam materiálů krychle, tedy MaterialsList a tím naše základní příprava končí. Přehled našich proměnných teď tedy vypadá takto (FLEX vám k nim automaticky dopíše importy relevantních knihoven):
public var view:BasicView;
public var krychle:Cube;
public var material:ColorMaterial;
public var seznamMaterialu:MaterialsList;
Přejděme do hlavní funkce a definujme si tedy novou scénu, na které se bude odehrávat naše divadlo.
BasicView lze inicializovat s parametry BasicView(sirka=640, vyska=480, scale=true, interaktivita=false, camera=”target”); Jak vidíte standardně je povolené scale, takže se velikost pv3d přizpůsobuje velikosti okna browseru. Povšimněte si pro budoucnost, že interaktivita je v základu vypnutá, často toto přehlédnutí stojí za nepochopitelnou neklikatelností scény. My tedy inicializujeme bez parametrů a využíváme vlastních pv3d funkcí hlídajících změny velikostí obrazovky.
V dalším kroku si vytvoříme materiály krychle. Stačí nám tedy rudý povrch přes celou krychli.
material = new ColorMaterial(0xFF0000,.5);
seznamMaterialu = new MaterialsList();
seznamMaterialu.addMaterial(material,"all");
Jednoduchý ColorMaterial je možné inicializovat s parametry ColorMaterial(šestnáctková hodnota barvy, průhlednost, interaktivita=false); Naše krychle je tedy napůl průhledná, červená a standardně neklikatelná. V seznamu materialu jsme jen přidali naší rudou s parametrem “all” tedy přes všechny strany.
Přidáme si tedy standardně pomocí addChild pv3d view (obsahující scénu, kameru a vše potřebné, ale o tom podrobněji příště), vytvoříme a do vnořené scény vložíme naší krychli a .. a spustíme render. Pokud jste se světem 3D ještě nikdy nesetkali malé vysvětlení. Naše krychle zatím existuje jako matematicky definovaný objekt kdesi ve virtuálním vesmíru scény pv3D, která je zapouzdřena do našeho view, sloužícího jako správce našeho 3D dění. Aby se z vektorů a abstraktních plošek stal objekt na obrazovce, je potřeba spustit tzv. render - ten spočítá vše potřebné a přetvoří rovnice do pixelů, které se zobrazí návštěvníkovi stránek. Jak jste již určitě vytušili, takovýto krok je potřeba udělat pokaždé, když se něco změní, ideálně tedy na každý onEnterFrame. Jelikož byl problém s překreslováním celé scény nedávno vyřešen, nepřinese to snížení rychlosti v případě, že se nic neděje. Objekty se kterými nebylo šoupáno se nebudou znova přepočítávat.
Náš kód vypadá tedy takto a hurá do prvního testovacího buildu:
package {
import flash.display.Sprite;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.shaders.GouraudShader;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.view.BasicView;
public class _pv3d_01 extends Sprite
{
public var view:BasicView;
public var krychle:Cube;
public var material:ColorMaterial;
public var seznamMaterialu:MaterialsList;
public function _pv3d_01()
{
view = new BasicView();
material = new ColorMaterial(0xFF0000,.5);
seznamMaterialu = new MaterialsList();
seznamMaterialu.addMaterial(material,"all");
addChild(view);
krychle = new Cube(seznamMaterialu)
view.scene.addChild(krychle);
view.singleRender();
}
}
}
Vaše první krychle, gratuluji. Tedy přesněji čtverec. Ono dokud se nezačne 3D objekt hýbat, těžko poznáte, že není 2D :-). Přidáme tedy funkci, která nám bude čtvercem krychlí otáčet dokola a průběžně renderovat výstup.
Do hlavní funkce přidáme volání naší otáčecí funkce:
addEventListener(Event.ENTER_FRAME, otocKrychli);
a k importům přidáme Event - odchytávání událostií, v našem případě tedy ENTER_FRAME..
import flash.events.Event;
Vytvoříme si jí a přesuneme do ní náš renderer:
public function otocKrychli(e:Event):void {
krychle.yaw(5);
view.singleRender();
}
Jak vidíte voláme funkci yaw. Slovnik.cz nám nabízí překlad “plourání” což je jistě zajímavý popis, ale nejde o nic jiného než o rotaci kolem vlastní osy tak, jak ji známe například od zeměkoule.
Výsledek by měl být na světě. Hledíte na svou první krychli v Papervision 3D. Není to moc, ale ani málo. V příštím tutorialu se od tohoto milníku odrazíme k větším výšinám!