Collada i Papervision3D – Wczytanie modelu i obsługa zdarzeń

11-25-2009 przez Piotr Wierzgała Zostaw odpowiedź »

Collada (.dae) to jeden z popularniejszych formatów modeli 3D dla Papervision. Możliwość tworzenia modeli 3D i stosowania ich w projektach przynosi ze sobą wiele nowych perspektyw dlatego warto poznać przynajmniej podstawy związane z ich obsługą. W tym wpisie pokażę jak użyć parsera plików .dae w celu dodania modelu do sceny, w jaki sposób uzyskać dostęp do poszczególnych składowych (obiektów) modelu oraz jak uczynić je interaktywnymi poprzez dodanie nasłuchiwania wybranych zdarzeń.

FLEX: 3.0, Papervision3D: 2.0.883

Pobierz źródła przykładu


Przed przeczytaniem tego wpisu warto zapoznać się z:
Pierwsze kroki z Papervision3D



Pola klasy
Pola klasy jakie w tym przykładzie będą nam potrzebne to:

private var dae:DAE;
private var head:DisplayObject3D;
private var neck:DisplayObject3D;
private var light:LightObject3D;
private var phongMaterialOver:PhongMaterial;
private var phongMaterialOut:PhongMaterial;

dae - Parser plików dae.
head, neck - Części składowe (obiekty) modelu.
light - Światło niezbędne do zastosowania materiału typu PhongMaterial.
phongMaterialOver, phongMaterialOut – materiały modelu.



Funkcja inicjalizująca obiekty 3D

private function init3d():void {
    dae = new DAE;
    light = new PointLight3D(true, true);
           
    phongMaterialOver = new PhongMaterial(light,0xdedede,0x333333,10);
    phongMaterialOver.interactive = true;
    phongMaterialOut = new PhongMaterial(light,0x333333,0xdedede,10);
    phongMaterialOut.interactive = true;
   
    dae.addEventListener(IOErrorEvent.IO_ERROR,daeFileIOErrorEventHandler)
    dae.load("com/model.dae");
}

Tworzymy instancje parsera i światła a następnie materiały modelu stosowane odpowiednio do zdarzeń OBJECT_OVER i OBJECT_OUT. Na koniec dodajemy nasłuchiwanie zdarzenia wczytania modelu po czym rozpoczynamy jego wczytywanie.



Funkcja obsługująca zdarzenie zakończenia wczytywania modelu

private function daeFileLoadCompleteEventHandler(event:FileLoadEvent):void {
    scene.addChild(dae);

    head = dae.getChildByName("Head",true);
    neck = dae.getChildByName("Neck",true);
           
    head.material = phongMaterial;
    neck.material = phongMaterial;
   
    addInteractiveEventListeners(dae,InteractiveScene3DEvent.OBJECT_OVER,objectOverEventHandler);
    addInteractiveEventListeners(dae,InteractiveScene3DEvent.OBJECT_OUT,objectOutEventHandler);
}

Funkcja obsługująca zdarzenie zakończenia wczytywania modelu dodaje go do sceny a następnie przypisuje zmiennym head i neck jego odpowiednie składowe. Nazwy składowych nadaje się podczas tworzenia modelu, ale jeżeli korzystamy z gotowca to albo otwieramy go w jakimś programie do modelowania 3D (np. Blender) i tam sprawdzamy jak nazywają się jego części albo kompilujemy projekt w trybie debug i tam w konsoli, po wczytaniu modelu, powinny pojawić się wszystkie szukane nazwy.
Kiedy mamy już referencje do składowych modelu przypisujemy im wybrany przez nas materiał i dodajemy do nich nasłuchiwanie odpowiednich zdarzeń.



Funkcja dodająca nasłuchiwanie zdarzeń do modelu

private function addInteractiveEventListeners(object:DisplayObject3D, eventType:String, handler:Function):void {
    object.addEventListener(eventType, handler);
    for each(var child:DisplayObject3D in object.children) {
        addInteractiveEventListeners(child, eventType, handler);
    }
}

Użyta pod koniec ostatniego listingu funkcja addInteractiveEventListeners przyjmuje trzy parametry:
object – Obiekt, do którego doda nasłuchiwanie zdarzenia.
eventType – Typ zdarzenia jakie zostanie obsłużone.
handler – identyfikator funkcji, która obsłuży zdarzenie typu eventType dla obiektu object.



Funkcje obsługujące zdarzenia modelu
Na koniec pozostaje tylko zamieścić kod funkcji obsługujących zdarzenie OBJECT_OVER i OBJECT_OUT oraz stwierdzić, że podstawowe zagadnienie związane z obsługą modeli Collada mamy już opanowane.

private function objectOverEventHandler(event:InteractiveScene3DEvent):void {
    event.target.material = compositeMaterial;
}
private function objectOutEventHandler(event:InteractiveScene3DEvent):void {
    event.target.material = phongMaterial;
}
Reklama

2 komentarzy

  1. exp pisze:

    Hej! Ciekawy tutorial, ale CPU skacze do 50% w Firefoxie, kiedy pracuje ta aplikacja z 3D.

  2. Piotr Wierzgała pisze:

    Według tego co jest napisane w książce Papervision3D Essentials (Rozdział 8, akapit “Keep your polygon count low”) liczba trójkątów z jakich zbudowany jest renderowany przez PV3D model nie powinna przekraczać trzech tysięcy. Model z tego tutorialu składa się z około 3500 trójkątów. W związku z tym domyślam się, że to właśnie jest przyczyną dużego zużycia CPU.

Dodaj komentarz

Flexmaniaks on Facebook