¿Qué es OBJ?
OBJ (Wavefront Object) es un formato de definición de geometría desarrollado por Wavefront Technologies en los años 80 para su paquete de animación Advanced Visualizer. Se convirtió en el estándar de facto para el intercambio de modelos 3D entre aplicaciones de modelado, animación y renderizado. A diferencia de STL, OBJ admite mallas poligonales (no solo triángulos), normales de vértices, coordenadas de textura, múltiples materiales y un archivo .mtl de materiales asociado.
OBJ es texto ASCII plano — legible por humanos, fácil de analizar y compatible con prácticamente todas las aplicaciones 3D: Blender, Maya, 3ds Max, Cinema 4D, ZBrush, Substance Painter, Unreal Engine, Unity.
Formato del Archivo OBJ
# Archivo OBJ generado por Blender
mtllib modelo.mtl # referencia al archivo de material
o Cubo # nombre del objeto
# Vértices
v 1.000000 1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
v -1.000000 1.000000 -1.000000
# Coordenadas de textura (UV)
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
# Normales de vértice
vn 0.0000 1.0000 0.0000
# Asignación de material
usemtl Material
# Caras: f vértice/textura/normal
f 1/1/1 3/2/1 2/3/1
Directivas Principales
| Directiva | Significado |
|---|---|
# |
Comentario |
v x y z |
Vértice geométrico (posición) |
vt u v |
Coordenada de textura (UV) |
vn x y z |
Normal de vértice |
f |
Definición de cara |
o nombre |
Nombre de objeto |
g nombre |
Asignación de grupo |
mtllib archivo.mtl |
Referencia a biblioteca de materiales |
usemtl nombre |
Aplicar material a las caras subsiguientes |
s grupo |
Número de grupo de suavizado (o off) |
Sintaxis de Cara
f v1 v2 v3 # triángulo, solo posiciones
f v1/vt1 v2/vt2 v3/vt3 # con coordenadas de textura
f v1//vn1 v2//vn2 v3//vn3 # con normales, sin UV
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 # completo: pos/uv/normal
f v1 v2 v3 v4 # cara cuádruple
Archivo de Material MTL
newmtl Material
Ka 0.1 0.1 0.1 # color ambiental
Kd 0.8 0.2 0.2 # color difuso (rojo)
Ks 1.0 1.0 1.0 # color especular (blanco)
Ns 50.0 # exponente especular (brillo)
d 1.0 # disolución (opacidad, 1.0 = opaco)
illum 2 # modelo de iluminación (2 = Phong)
map_Kd textura.png # mapa de textura difusa
map_bump normal.png # mapa bump/normal
Grupos de Suavizado
Los grupos de suavizado controlan cómo se promedian las normales entre caras para el sombreado suave:
s 1
f 1/1/1 2/2/2 3/3/3 # estas caras comparten normales suaves
s off
f 4/4/4 5/5/5 6/6/6 # sombreado plano para estas caras
Limitaciones de OBJ
- Solo ASCII: sin formato binario — los modelos grandes pueden ser decenas de MB de texto.
- MTL es primitivo: sin soporte nativo para PBR — la mayoría de herramientas extienden MTL o usan FBX/GLTF.
- Sin animación: geometría puramente estática — para animación usa FBX, GLTF/GLB o USD.
- Sin jerarquía de escena: los grupos son planos — sin relaciones padre-hijo.
- Índice base 1: los vértices están indexados desde 1, no desde 0.
- La ruta MTL es relativa: el archivo MTL debe estar en el mismo directorio que el OBJ.
- Sin sistema de unidades: como STL, las unidades son implícitas.
OBJ vs. Otros Formatos 3D
| Formato | Texturas | Animación | PBR | Binario | Jerarquía | Mejor para |
|---|---|---|---|---|---|---|
| OBJ | Sí (MTL) | No | No | No | No | Intercambio de modelos |
| STL | No | No | No | Sí | No | Impresión 3D |
| FBX | Sí | Sí | Parcial | Sí | Sí | Pipeline juegos/cine |
| GLTF/GLB | Sí | Sí | Sí | Sí (GLB) | Sí | Web/tiempo real |
| USD/USDA | Sí | Sí | Sí | Sí (USDC) | Sí | VFX/pipeline Pixar |
Análisis de OBJ en Python
import trimesh
# Cargar OBJ con textura
malla = trimesh.load('modelo.obj')
print(f"Vértices: {len(malla.vertices)}, Caras: {len(malla.faces)}")
print(f"Volumen: {malla.volume:.2f}")
print(f"¿Estanca?: {malla.is_watertight}")
# Exportar como STL
malla.export('modelo.stl')
OBJ en Pipelines 3D
Desarrollo de juegos: OBJ es un formato intermedio — los activos se exportan de Maya/Blender como OBJ, luego se importan en Unity/Unreal.
Web 3D: OBJ es compatible con Three.js (OBJLoader), aunque GLTF/GLB es ahora el preferido por su eficiencia binaria, soporte de animación y materiales PBR.
Escaneo 3D: las herramientas de fotogrametría (Agisoft Metashape, RealityCapture, Polycam) exportan OBJ con textura por defecto — la malla con coordenadas UV y una imagen de textura separada.
Conversión de OBJ
- OBJ → STL: Blender, MeshLab, FreeCAD — triangula quads.
- OBJ → GLTF/GLB: exportación Blender, o
obj2gltf(herramienta Node.js). - OBJ → FBX: Blender, Maya, Autodesk FBX Converter.
- STL → OBJ: MeshLab, Blender — añade material ficticio y coordenadas UV.
- FBX → OBJ: Blender, Autodesk FBX Converter.
Buenas Prácticas
- Mantén siempre OBJ y MTL juntos — son archivos separados que se referencian mutuamente.
- Usa rutas relativas en MTL — evita rutas absolutas que se rompen en otras máquinas.
- Triangula antes de exportar si la aplicación objetivo no maneja n-gons.
- Empaqueta texturas con el modelo — comprime OBJ + MTL + todas las texturas juntas.
- Usa GLTF/GLB en lugar de OBJ para web 3D, renderizado en tiempo real o cualquier cosa que requiera PBR.
- Usa FBX en lugar de OBJ para pipelines de motores de juegos con animaciones.
- Para modelos grandes, considera formatos binarios (GLB, FBX) — el tamaño ASCII de OBJ es un cuello de botella.
- Verifica las normales después de exportar — algunas herramientas invierten el orden de devanado entre sistemas de coordenadas.
- Usa trimesh en Python para carga eficiente de OBJ con operaciones booleanas y análisis de malla.
- Voltea UVs verticalmente al cambiar entre convenciones DirectX (V volteado) y OpenGL (estándar).
Conversiones relacionadas
Conversiones frecuentes del catálogo: