A Blender addon that provides an alternative COLLADA (.dae) import pipeline by first converting to the Wavefront OBJ format, which resolves common texture and geometry issues with Blender's built-in COLLADA importer.
Vibe-coded with Claude.ai, based on the original design by georgethrax/collada2obj.
Blender's native COLLADA importer can sometimes struggle with certain .dae files — particularly assets exported from game engines or third-party tools — producing missing textures, broken normals, or geometry errors. This addon sidesteps those issues by parsing the COLLADA XML directly and converting it to OBJ + MTL files before feeding them into Blender's much more reliable OBJ importer.
| File | Description |
|---|---|
dea2obj2import.py |
Main addon — imports .dae files into Blender via an OBJ intermediate step, with full texture support, automatic texture copying, and intelligent mesh/material naming. |
dea2objconverter.py |
Standalone converter addon — adds a sidebar panel in the 3D Viewport to convert .dae files to OBJ+MTL on disk with material and texture mapping (without importing into Blender). Useful for batch conversion or external workflows. |
Both addons share the same core conversion functions:
_find_texture_file()— recursive texture discovery_parse_sources()— extract vertex data from DAE_parse_vertex_semantics()— extract semantic mappings_build_material_texture_map()— extract material-texture relationships via COLLADA effect chainconvert_dae_to_obj()— main DAE→OBJ conversion logic_triangulate_face()— polygon triangulation
Important: If you fix a bug or add a feature to any of these shared functions, please apply the same fix to both dea2obj2import.py and dea2objconverter.py. Each file has a comment block at the top of its conversion section documenting the shared functions.
- Parses COLLADA XML directly (no external dependencies)
- Namespace-aware XML parsing — supports both COLLADA 1.4.1 and 1.5.0 formats
- Robust element discovery — uses both namespace-aware queries and fallback mechanisms for maximum compatibility
- Extracts vertices, normals, and UV coordinates with proper offset tracking
- Detects and links texture images from
library_imageswith recursive subdirectory search - Automatic material-to-texture mapping via the effect chain (image → effect → material)
- Generates a proper
.mtlmaterial file alongside the OBJ with texture references - Supports multiple mesh objects within a single
.daefile (mesh separation by material) - Intelligent naming scheme for multiple imports:
Mesh_N.NNNpattern (e.g., first import: Mesh_0.001, Mesh_0.002; second import: Mesh_1.001, Mesh_1.002) - Automatic texture file copying and renaming to match the naming scheme
- Handles both unified and separate vertex format types
- Handles Blender 2.80+ and Blender 4.x (uses the correct OBJ import operator for each version)
- Optional temp-file mode: converts to a temporary directory and cleans up after import
- Integrates cleanly into File > Import > COLLADA (.dae) menu
- Blender 2.80 or newer (including Blender 4.x)
- No external Python packages required — uses only Python's standard
xml.etree.ElementTree
- Download or clone this repository.
- Open Blender and go to Edit > Preferences > Add-ons.
- Click Install... and select either
dea2obj2import.pyordea2objconverter.py. - Enable the addon by checking the checkbox next to its name.
Copy the script(s) to your Blender addons directory:
- Windows:
%APPDATA%\Blender Foundation\Blender\<version>\scripts\addons\ - macOS:
~/Library/Application Support/Blender/<version>/scripts/addons/ - Linux:
~/.config/blender/<version>/scripts/addons/
Then enable the addon in Edit > Preferences > Add-ons.
- Go to File > Import > COLLADA Custom (.dae).
- Browse to and select your
.daefile. - Optionally toggle Use Temporary File in the import options panel:
- Enabled (default): The intermediate OBJ and MTL are written to a system temp directory and deleted after import.
- Disabled: The converted
.objand.mtlfiles are saved in the same directory as the source.dae, with the suffix_converted.
- Click Import COLLADA (.dae).
Make sure any texture files referenced by the .dae are located in the same directory as the .dae file. The addon will find and copy them automatically during import.
- Open the 3D Viewport sidebar (press N if hidden).
- Navigate to the DAE Converter tab.
- Click Convert .dae to .obj.
- Select your
.daefile in the file browser. - The converted
.objand.mtlfiles will be saved in the same directory as the source file.- The
.objfile will be named<original_name>.obj - The
.mtlfile will contain all extracted materials and texture references - Texture files are NOT copied; only geometric and material data are extracted
- The
- The
.daefile is parsed as XML using Python's standard library. - COLLADA namespace handling:
- The code uses namespace-aware XML queries (
{*}tag) to work with namespaced COLLADA files - A fallback mechanism directly iterates through elements and matches by tag name for compatibility with different DAE formats
- This dual approach ensures broad compatibility across various COLLADA versions (1.4.x and 1.5.x)
- The code uses namespace-aware XML queries (
- Material-to-texture extraction via the COLLADA effect chain:
- Images are extracted from
library_imageswith support for both direct (<init_from>filename</init_from>) and nested (<init_from><ref>filename</ref></init_from>) formats - Effects are extracted from
library_effects, connecting to images via surface references - Materials are extracted from
library_materials, linking to effects viainstance_effect - This chain (image → effect → material) is traversed to build the complete material-texture map
- Texture files are searched recursively in subdirectories (e.g., "Custom Color 1/", "Alt Textures/")
- Images are extracted from
- Geometry data is extracted from
library_geometries:- Vertex positions from the
VERTEXsource - Normals from the
NORMALsource - UV coordinates from the
TEXCOORDsource
- Vertex positions from the
- The data is written to a temporary (or permanent)
.objfile with a matching.mtlmaterial file containing all discovered textures. - Blender's native OBJ importer (
wm.obj_importon Blender 4+ orimport_scene.objon older versions) handles the final import. - Mesh and material renaming:
- All imported meshes are renamed to the pattern
Mesh_N.NNNwhere N is the import counter - Materials are renamed to
Material_N.NNNto match - Texture files are copied and renamed accordingly
- If a file with the same name already exists, it's preserved and reused (avoiding unnecessary duplication)
- All imported meshes are renamed to the pattern
When a .dae file contains multiple <geometry> elements, each is parsed into a separate mesh object (Mesh_0, Mesh_1, etc.) and written as named objects (o) in the OBJ file. Vertex, UV, and normal index offsets are tracked and adjusted correctly for each mesh.
- Only triangulated faces are supported (
<triangles>elements).<polylist>elements are converted to triangles via fan-triangulation, while<polygons>elements are not currently handled. - COLLADA features such as animations, skinning, cameras, and lights are ignored — only static geometry is imported.
- The
dea2objconverter.pyscript does not copy texture files; it only outputs geometry. Usedea2obj2import.pyfor complete texture support.
- ✅ Full namespace support for namespaced COLLADA format files
- ✅ Material-to-texture mapping via COLLADA effect chain (image → effect → material)
- ✅ Recursive texture discovery in subdirectories
- ✅ Multiple texture format support (both
<init_from>filename</init_from>and<init_from><ref>filename</ref></init_from>) - ✅ Mesh separation by material with proper naming scheme
- ✅ Automatic texture copying and renaming for multi-import workflows
- ✅ UV map support with proper offset tracking for both unified and separate vertex formats
Contributions and bug reports are welcome. If you encounter a .dae file that doesn't import correctly, feel free to open an issue with details about the file format and any error messages.
See LICENSE for details.
- Original COLLADA-to-OBJ conversion concept: georgethrax/collada2obj
- Addon development: vibe-coded with Claude.ai