Formato Collada DAE: Intercambio 3D Basado en XML
Collada (Collaborative Design Activity) es un formato abierto de intercambio 3D basado en XML, definido por el estándar ISO 17506:2012 y mantenido por el Khronos Group — el mismo consorcio detrás de OpenGL, Vulkan y glTF. El formato usa la extensión .dae (del inglés Digital Asset Exchange), y fue diseñado desde el principio para ser tanto legible por humanos como procesable por máquinas, soportando datos de escena enriquecidos incluyendo geometría, animación, física y sombreado.
Aunque glTF ha desplazado a Collada en muchos flujos de trabajo modernos, DAE sigue siendo ampliamente usado en pipelines de desarrollo de videojuegos, mundos virtuales OpenSim, simulaciones de robótica (particularmente con ROS y Gazebo), visualización CAD, y cualquier lugar donde se prefiera un formato 3D abierto e inspeccionable sobre un binario propietario.
Orígenes de Collada
Collada fue iniciado en 2004 por Sony Computer Entertainment como formato para compartir activos 3D entre herramientas de desarrollo de videojuegos. El nombre refleja su filosofía fundacional: diferentes equipos que usan diferentes software 3D necesitan un formato portador neutro que no pierda información al moverse entre aplicaciones.
La versión 1.4.1 se convirtió en el estándar ampliamente adoptado, soportado en Blender, Maya, 3ds Max, Cinema 4D y muchos motores de juegos. La versión 1.5 añadió extensiones de modelado físico, soporte de geometría B-rep y datos cinemáticos — haciendo a Collada relevante para robótica e ingeniería más allá de sus raíces en el desarrollo de juegos.
El Khronos Group asumió la custodia del formato en 2006 y lo ha publicado como estándar ISO, garantizando estabilidad a largo plazo y gobernanza neutral entre vendedores.
Estructura del Archivo DAE
Como Collada es XML, cada archivo DAE es un documento XML bien formado. El elemento raíz es <COLLADA> con un atributo version. Bajo la raíz, los datos se organizan en librerías — colecciones de definiciones relacionadas — y una escena visual que ensambla esas definiciones en una jerarquía renderizable.
<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
<asset>
<created>2024-03-15</created>
<modified>2024-03-15</modified>
<unit name="meter" meter="1"/>
<up_axis>Y_UP</up_axis>
</asset>
<library_geometries> ... </library_geometries>
<library_materials> ... </library_materials>
<library_effects> ... </library_effects>
<library_images> ... </library_images>
<library_controllers> ... </library_controllers>
<library_animations> ... </library_animations>
<library_visual_scenes> ... </library_visual_scenes>
<scene>
<instance_visual_scene url="#Scene"/>
</scene>
</COLLADA>
El bloque <asset> contiene metadatos: fecha de creación, unidades y la convención de eje hacia arriba. El elemento up_axis — Y_UP, Z_UP o X_UP — es crítico para que los importadores orienten correctamente la escena.
Geometría: Mallas en Collada
La geometría en Collada se define en <library_geometries>. Cada elemento <geometry> contiene un <mesh> que almacena datos de vértices en arrays fuente y los conecta mediante referencias de entrada:
<library_geometries>
<geometry id="Cubo-mesh" name="Cubo">
<mesh>
<source id="Cubo-mesh-positions">
<float_array id="positions-array" count="24">
1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
1 1 1 -1 1 1 -1 -1 1 1 -1 1
</float_array>
<technique_common>
<accessor source="#positions-array" count="8" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Cubo-mesh-vertices">
<input semantic="POSITION" source="#Cubo-mesh-positions"/>
</vertices>
<triangles material="Material-material" count="12">
<input semantic="VERTEX" source="#Cubo-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cubo-mesh-normals" offset="1"/>
<p>0 0 2 1 3 2 3 3 4 4 7 5 ...</p>
</triangles>
</mesh>
</geometry>
</library_geometries>
El elemento <p> (índices primitivos) es un array plano de enteros. Cada tupla de valores — uno por <input> — define un único vértice de un triángulo. Este enfoque indexado de múltiples flujos permite que posiciones y normales usen índices diferentes, reduciendo la redundancia de datos en mallas grandes.
Materiales y Efectos
Collada separa el concepto de materiales (vinculaciones de nombres simples) de efectos (los parámetros de sombreado reales). Este diseño de dos capas permite que una única definición de efecto se comparta entre múltiples materiales.
<library_effects>
<effect id="Material-effect">
<profile_COMMON>
<technique sid="common">
<phong>
<ambient><color>0.1 0.1 0.1 1</color></ambient>
<diffuse>
<texture texture="Textura0" texcoord="UVMap"/>
</diffuse>
<specular><color>0.5 0.5 0.5 1</color></specular>
<shininess><float>50</float></shininess>
</phong>
</technique>
</profile_COMMON>
</effect>
</library_effects>
<library_materials>
<material id="Material-material" name="Material">
<instance_effect url="#Material-effect"/>
</material>
</library_materials>
El elemento profile_COMMON define el sombreado usando parámetros clásicos de Phong (ambiental, difuso, especular, brillo). Collada también soporta <profile_CG> y <profile_GLSL> para código de shader personalizado, aunque estos perfiles tienen soporte limitado entre herramientas.
Animación de Esqueleto en Collada
La animación en Collada es más verbosa que en FBX pero igualmente expresiva. El esqueleto se define como una jerarquía de elementos <node> con type="JOINT", y la deformación de piel se expresa mediante un elemento <controller>:
<library_controllers>
<controller id="Armature_Cubo-skin">
<skin source="#Cubo-mesh">
<bind_shape_matrix>1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</bind_shape_matrix>
<source id="joints">
<Name_array count="3">Hueso Hueso_001 Hueso_002</Name_array>
</source>
<source id="pesos">
<float_array count="6">1 0.7 0.3 0.5 0.8 0.2</float_array>
</source>
<vertex_weights count="8">
<input semantic="JOINT" source="#joints" offset="0"/>
<input semantic="WEIGHT" source="#pesos" offset="1"/>
<vcount>2 2 2 2 2 2 2 2</vcount>
<v>0 0 1 1 0 0 1 1 ...</v>
</vertex_weights>
</skin>
</controller>
</library_controllers>
Las animaciones de keyframes se almacenan en <library_animations>:
<library_animations>
<animation id="Hueso_rotacion_X">
<source id="input">
<float_array count="5">0 0.25 0.5 0.75 1.0</float_array>
</source>
<source id="output">
<float_array count="5">0 30 45 30 0</float_array>
</source>
<sampler id="muestreador">
<input semantic="INPUT" source="#input"/>
<input semantic="OUTPUT" source="#output"/>
</sampler>
<channel source="#muestreador" target="Hueso/rotation.X"/>
</animation>
</library_animations>
El atributo target del <channel> usa una expresión de ruta para apuntar a la propiedad específica que se anima, haciendo que los datos de animación sean autodocumentados.
Física en Collada 1.5
Una de las características distintivas de Collada es su modelo de física integrado, añadido en la versión 1.5. Esto lo hace especialmente adecuado para robótica y casos de uso de simulación:
<library_physics_materials>
<physics_material id="Mat">
<technique_common>
<dynamic_friction>0.5</dynamic_friction>
<static_friction>0.5</static_friction>
<restitution>0.3</restitution>
</technique_common>
</physics_material>
</library_physics_materials>
<library_physics_scenes>
<physics_scene id="Escena_Fisica">
<technique_common>
<gravity>0 -9.81 0</gravity>
<time_step>0.01</time_step>
</technique_common>
</physics_scene>
</library_physics_scenes>
El Sistema Operativo de Robots (ROS) usa Collada como uno de sus formatos principales para la descripción de modelos de robots, junto con URDF. Gazebo, el simulador físico usado con ROS, puede importar y exportar archivos Collada directamente.
Escena Visual y Jerarquía de Nodos
La escena visual une todas las librerías en un grafo de escena:
<library_visual_scenes>
<visual_scene id="Scene" name="Scene">
<node id="Armature" name="Armature" type="NODE">
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
<node id="Hueso" name="Hueso" sid="Hueso" type="JOINT">
<matrix sid="transform">1 0 0 0 0 0.9659 -0.2588 0 0 0.2588 0.9659 0 0 0 0 1</matrix>
</node>
<instance_controller url="#Armature_Cubo-skin">
<skeleton>#Hueso</skeleton>
<bind_material>
<technique_common>
<instance_material symbol="Material-material" target="#Material-material"/>
</technique_common>
</bind_material>
</instance_controller>
</node>
</visual_scene>
</library_visual_scenes>
Los elementos <matrix> almacenan matrices de transformación 4×4 en orden columna-mayor. El elemento <instance_controller> conecta una malla con piel al nodo raíz de su esqueleto.
Conversión de Archivos DAE
Python con PyCollada
import collada
malla = collada.Collada("robot.dae")
for geometria in malla.geometries:
print(f"Geometría: {geometria.id}")
for primitiva in geometria.primitives:
print(f" Triángulos: {len(primitiva)}")
print(f" Vértices: {primitiva.vertex.shape}")
for animacion in malla.animations:
print(f"Animación: {animacion.id}")
API de Python en Blender
import bpy
# Importar DAE
bpy.ops.wm.collada_import(
filepath="/ruta/al/modelo.dae",
import_units=True,
fix_orientation=True,
auto_connect=True,
find_chains=True,
)
# Exportar a DAE
bpy.ops.wm.collada_export(
filepath="/ruta/al/salida.dae",
apply_modifiers=True,
selected=False,
include_children=True,
include_armatures=True,
include_animations=True,
use_texture_copies=True,
)
Collada vs FBX vs glTF
| Característica | Collada DAE | FBX | glTF/GLB |
|---|---|---|---|
| Estándar abierto | ✅ ISO 17506 | ❌ Propietario | ✅ Khronos |
| Legible por humanos | ✅ XML | ❌ Binario (principalmente) | ❌ Binario (GLB) |
| Soporte de física | ✅ v1.5+ | ❌ No | ❌ No |
| Soporte robótico | ✅ ROS/Gazebo | ❌ Raramente | ❌ Raramente |
| Tamaño de archivo | Grande (XML) | Medio | Pequeño |
| PBR nativo | ❌ Era Phong | Parcial | ✅ Nativo |
| Web/AR/VR | ❌ Pobre | ❌ Pobre | ✅ Diseñado para ello |
Casos de Uso Comunes
Robótica — ROS y Gazebo usan Collada para definiciones de modelos de robots porque el formato XML es editable manualmente, las extensiones de física están integradas, y los datos cinemáticos de URDF se mapean limpiamente al sistema de articulaciones de Collada.
Desarrollo de videojuegos — Proyectos más antiguos de Unity y Unreal frecuentemente usaban DAE como formato de intercambio. Los proyectos modernos típicamente prefieren FBX o glTF, pero DAE sigue siendo soportado en ambos motores.
Mundos virtuales — OpenSimulator (la plataforma de código abierto similar a Second Life) usa Collada como su formato de malla principal para la carga de contenido generado por usuarios.
CAD a motor de juegos — SolidWorks, FreeCAD y otras herramientas CAD pueden exportar Collada, convirtiéndolo en una ruta común para llevar modelos de ingeniería al software de visualización.
Conclusión
La base XML de Collada es tanto su mayor fortaleza como su mayor limitación. El formato es autodocumentado, inspeccionable sin herramientas especiales, y ricamente expresivo — cubriendo geometría, materiales, animación, física y cinemática en un único archivo. Estas propiedades lo hacen indispensable en robótica y cualquier flujo de trabajo donde la trazabilidad y la apertura importan más que el tamaño de archivo y la velocidad de carga. Para aplicaciones en tiempo real de alto rendimiento, glTF ha tomado el lugar de Collada, pero para simulaciones científicas, autoría de modelos de robots y archivo a largo plazo de escenas 3D complejas, la transparencia del formato DAE y su estandarización ISO siguen siendo únicamente valiosas.
Conversiones relacionadas
Conversiones de documento que siguen este tema: