¿Qué es USD?
USD — Universal Scene Description — es un framework abierto para describir, componer e intercambiar escenas 3D desarrollado por Pixar Animation Studios. Publicado como código abierto en 2016 bajo la Licencia Apache 2.0 Modificada, USD se ha convertido en la representación de escena fundamental para pipelines 3D profesionales, motores en tiempo real y aplicaciones de realidad aumentada.
A diferencia de los formatos diseñados para un único activo (una malla, una textura), USD describe escenas completas — cámaras, geometría, luces, shaders, materiales, animación, física y las relaciones entre todos estos elementos — de forma escalable y composable. Pixar lo desarrolló para resolver los problemas de gestionar producciones cinematográficas masivas como Toy Story, Cars y Coco, donde miles de activos y cientos de artistas necesitaban colaborar sin sobrescribir el trabajo ajeno.
Variantes de Archivos USD
| Extensión | Formato | Descripción |
|---|---|---|
.usda |
ASCII | Formato de texto legible por humanos; excelente para depuración y control de versiones |
.usdc |
Binario (Crate) | Formato binario compacto; carga 10–100× más rápido que USDA |
.usd |
Cualquiera | Puede ser USDA o USDC — el software lo determina inspeccionando el archivo |
.usdz |
Archivo ZIP | Paquete autocontenido: USD + texturas + audio; el formato AR de entrega de Apple |
Jerarquía de Escena USD: Prims y Propiedades
Cada escena USD se organiza como un árbol jerárquico de Prims (primitivas):
#usda 1.0
(
defaultPrim = "Mundo"
upAxis = "Y"
metersPerUnit = 0.01
)
def Xform "Mundo"
{
def Xform "Personajes"
{
def Mesh "Robot" (
references = @./activos/robot.usdc@</Robot>
)
{
double3 xformOp:translate = (0, 0, 0)
uniform token[] xformOpOrder = ["xformOp:translate"]
}
}
def Xform "Entorno"
{
def Mesh "Suelo"
{
point3f[] points = [(-10, 0, -10), (10, 0, -10),
(10, 0, 10), (-10, 0, 10)]
int[] faceVertexCounts = [4]
int[] faceVertexIndices = [0, 1, 2, 3]
}
def DomeLight "Cielo"
{
asset inputs:texture:file = @./hdri/exterior.exr@
float inputs:intensity = 1.0
}
}
def Camera "CamaraPrincipal"
{
float2 clippingRange = (0.1, 100000)
float focalLength = 35
}
}
Los Prims tienen: un tipo (Mesh, Xform, Camera, Material, Shader, DomeLight, etc.), atributos (propiedades tipadas con valores con muestras de tiempo), relaciones (conexiones entre prims) y metadatos (anotaciones no tipadas).
Arcos de Composición: El Núcleo del Poder
La característica definitoria de USD es su sistema de composición — un conjunto de reglas para combinar múltiples archivos de capa en una vista única de la escena:
| Arco | Palabra clave | Propósito |
|---|---|---|
| SubCapas | subLayers = [...] |
Apilar capas — las más fuertes anulan las más débiles |
| Referencias | references = @archivo@</prim> |
Incorporar activos externos |
| Payloads | payload = @archivo@</prim> |
Carga diferida — solo carga cuando se activa |
| Herencias | inherits = </PrimBase> |
Herencia de propiedades basada en clases |
| VariantSets | variantSet "color" {...} |
Variantes intercambiables no destructivas |
Los VariantSets permiten el cambio no destructivo entre alternativas:
def Mesh "Silla" (
variantSets = "material"
variants = {
string material = "madera"
}
)
{
variantSet "material" = {
"madera" {
rel material:binding = </Materiales/Madera>
}
"metal" {
rel material:binding = </Materiales/AceroEpillado>
}
"plastico" {
rel material:binding = </Materiales/PlasticoAzul>
}
}
}
API Python de USD
Los bindings Python de USD (paquete pxr) se instalan con OpenUSD:
from pxr import Usd, UsdGeom, Gf, Sdf
# Crear una nueva escena USD
escenario = Usd.Stage.CreateNew("escena.usda")
escenario.SetMetadata("upAxis", "Y")
escenario.SetStartTimeCode(1)
escenario.SetEndTimeCode(120) # 120 fotogramas a 24fps = 5 segundos
# Crear un Xform (nodo de transformación)
xform = UsdGeom.Xform.Define(escenario, "/Mundo/Robot")
xform.AddTranslateOp().Set(Gf.Vec3f(0, 0, 0))
# Crear una malla
malla = UsdGeom.Mesh.Define(escenario, "/Mundo/Robot/Cuerpo")
malla.CreatePointsAttr([Gf.Vec3f(-0.5, 0, -0.5),
Gf.Vec3f( 0.5, 0, -0.5),
Gf.Vec3f( 0.5, 0, 0.5),
Gf.Vec3f(-0.5, 0, 0.5)])
malla.CreateFaceVertexCountsAttr([4])
malla.CreateFaceVertexIndicesAttr([0, 1, 2, 3])
# Animar la traslación: el robot se mueve de fotograma 1 a 120
attr_traslacion = xform.GetTranslateOp()
attr_traslacion.Set(Gf.Vec3f(0, 0, 0), 1)
attr_traslacion.Set(Gf.Vec3f(5, 0, 0), 120)
escenario.Save()
USDZ: El Formato AR de Apple
USDZ es un archivo ZIP (sin compresión, para alineación de bytes) que contiene un archivo USD más todas las texturas y audio referenciados. Apple adoptó USDZ como formato 3D nativo para AR Quick Look en iOS/iPadOS y Apple Vision Pro.
Crear USDZ:
# Usando las herramientas de línea de comandos de Xcode
xcrun usdz_converter entrada.usd salida.usdz -f texturas_entrada/
# Python usando OpenUSD
from pxr import UsdUtils
UsdUtils.CreateNewUsdzPackage("entrada.usda", "salida.usdz")
iOS muestra archivos USDZ en línea en Safari, Mail, Mensajes y Archivos — toca un enlace .usdz y se abre inmediatamente en AR Quick Look, permitiendo a los usuarios colocar el objeto 3D en su entorno físico.
USD vs glTF
| Característica | USD | glTF 2.0 |
|---|---|---|
| Composición | Avanzada (arcos, capas, variantes) | Ninguna (activo único plano) |
| Complejidad de archivo | Alta (requiere toolkit) | Baja (JSON + binario) |
| Nativo para web | No | Sí (WebGL, model-viewer) |
| AR (iOS) | Sí (USDZ) | Mediante conversión |
| AR (Android) | Limitado | Sí (model-viewer) |
| Variantes | VariantSets (no destructivo) | No |
| Enfoque de industria | VFX cinematográfico, motores en tiempo real | Web, móvil, videojuegos |
Usa USD para activos de producción complejos con variantes, composición multicapa, materiales de calidad cinematográfica y AR de Apple. Usa glTF para entrega web, AR móvil sencilla en Android e interoperabilidad con motores de juego.
Conversiones relacionadas
Conversiones frecuentes del catálogo: