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 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
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
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
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.
event.target.material = compositeMaterial;
}
event.target.material = phongMaterial;
}
Hej! Ciekawy tutorial, ale CPU skacze do 50% w Firefoxie, kiedy pracuje ta aplikacja z 3D.
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.
Dzięki za ten tekst, możesz mieć pewność, że jeszcze nie jeden raz wrócę tu ażeby cokolwiek ciekawego poczytać.