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

November 25th, 2009 by Piotr Wierzgała Leave a reply »

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;
}
Advertisement

3 comments

  1. exp says:

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

  2. Piotr Wierzgała says:

    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.

  3. Dzięki za ten tekst, możesz mieć pewność, że jeszcze nie jeden raz wrócę tu ażeby cokolwiek ciekawego poczytać.

Leave a Reply

Flexmaniaks on Facebook