Actionscript 3 – Papervision3D Interactive Collada, DAE objects.
Para los que no saben lo que es un Collada o DAE, los archivos Collada son modelos 3D, exportados a formato xml. Basicamente se define dentro de este xml, cada vertice, mesh, material, etc. de un objeto. Si se estan preguntando para que podria llegar a servir esto, la respuesta es sencilla, para transportar de manera universal los modelos a otras tecnologias, como en este caso es papervision3D, que posee un DAEParser que genera estos modelos en nuestro escenario.
Mas informacion de los archivos Collada en wikipedia
Para lograr que un objeto collada sea interactivo dentro de papervision3D, debemos cumplir con los siguientes requerimientos:
- Que el viewport sea interactivo…. viewport.interactive = true.
- Que todos los materiales del collada tambien sean interactivos.
- Y por ultimo, pero lo mas importante agregar el listener para el InteractiveScene3DEvent en cada uno de los objetos dentro de nuestro collada.
Como en general, si estan trabajando con colladas descargados de por ahi y no creados por ustedes mismos, no sabran que cantidad de subobjetos tenga su collada, y lo mismo para la cantidad de materiales, es por eso que para agregar los listeners yo uso una funcion recursiva que se los agregue a cada child. Para los materiales es un poco mas sencillo, accediendo a la lista de materiales del objetos puedes setearlos a todos como interactivos.
Aca les pongo un ejemplo de como seteo cada material como interactivo:
1 2 3 4 5 6 7 | private function setInteractiveMaterials(targetObject:DisplayObject3D, value:Boolean):void { for each(var mat:MaterialObject3D in _targetObject.materials.materialsByName) { mat.interactive = value; } } |
Luego de tener todos los materiales del objeto como interactivos solo resta agregar el listener a cada child. Eso lo hago mediante la siguiente funcion.
1 2 3 4 5 6 7 8 | private function addEventListeners(displayObject:DisplayObject3D, eventType:String, listener:Function):void { displayObject.addEventListener(eventType, listener); for each(var child:DisplayObject3D in displayObject.children) { addEventListeners(child, eventType, listener); } } |
La llamada a la funcion seria algo asi:
1 | addEventListeners(_obj, InteractiveScene3DEvent.OBJECT_PRESS, daePressedHandler); |
Realmente no estoy seguro si esta es la mejor manera de hacer eso, cualquier sugerencia y/o comentario sera bien recibido.
VER EJEMPLO
DESCARGAR EJEMPLO PARA CS4
DESCARGAR EJEMPLO PARA CS3




