Miami, Blog
30
Mar

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:

Code:


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.

Code:


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:

Code:


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

1 comment

Comment from: Victor [Visitor]
*****
Muchas gracias Miguel, llevo dos días buscando una solución para esto, y esta es la más sencilla y funcional...
09.12.09 @ 12:23

Leave a comment


Your email address will not be revealed on this site.

Your URL will be displayed.
PoorExcellent
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)
estate, seo