¿Qué es Omniverse?
Omniverse es una plataforma de NVIDIA con la que se pueden crear, conectar y simular mundos 3D virtuales – y todo en tiempo real. Omniverse es una plataforma abierta para desarrolladores, diseñadores, ingenieros, investigadores y creativos, para:
- Conectar aplicaciones 3D entre sí (p. ej. Blender, Maya, Unreal Engine)
- Colaborar en una única escena – en vivo y de forma simultánea.
- Crear simulaciones físicamente realistas y aplicaciones impulsadas por IA.
¿Para qué se utiliza Omniverse?
- Diseño, visualización y simulación de objetos como, por ejemplo, vehículos en tiempo real.
- Gemelos digitales de fábricas para optimizar procesos.
- Creación de assets y simulaciones visuales.
- Entrenamiento con datos sintéticos, p. ej. para vehículos autónomos.
- Colaboración en tiempo real al animar y renderizar.
¿Qué es USD?
Omniverse se basa en el formato OpenUSD (Universal Scene Description) de Pixar – un formato de archivo que puede describir escenas 3D complejas.
¿Qué es el Omniverse Kit SDK?
El Omniverse Kit SDK es el framework de desarrollo de NVIDIA Omniverse, con el que se pueden crear aplicaciones 3D propias. Su núcleo es el Kit Kernel, que gestiona los ciclos de vida (Lifecycles) y actúa como tiempo de ejecución para las extensiones. El concepto más importante son las Extensions (extensiones): todo en Kit está construido de forma modular como una extensión – desde el renderizado hasta la gestión de assets y la IU. El Kit SDK ofrece un conjunto de extensiones base (p. ej. renderizado, viewport, omni.ui para la interfaz de usuario) y herramientas que los desarrolladores pueden utilizar.
NVIDIA describe el Kit SDK de la siguiente manera:
„En su núcleo, el Omniverse Kit SDK es un framework para gestionar eficazmente extensiones y plugins. Proporciona las herramientas necesarias para que los desarrolladores ensamblen una combinación de extensiones proporcionadas por NVIDIA y otras desarrolladas por ellos mismos para crear aplicaciones ricas y completas en funcionalidades.“
En pocas palabras, el Kit SDK proporciona los bloques y la estructura básica para construir aplicaciones completas de Omniverse mediante extensiones. Muchas aplicaciones oficiales de Omniverse (como USD Composer para creación de escenas 3D u Omniverse Code para desarrollo de extensiones) están basadas en el Kit SDK y lo utilizan para componer sus funcionalidades.

Arquitectura de Omniverse Kit
Abajo se muestra el Kit SDK (Kit Kernel y bibliotecas), y encima una aplicación Kit personalizada con su archivo de configuración .kit y sus extensiones. A la izquierda, la Extension Registry (catálogo de extensiones) con extensiones núcleo de NVIDIA y ejemplos.
¿Qué es el Omniverse Kit App Template?
El NVIDIA Omniverse Kit SDK y el Kit App Template son dos componentes estrechamente relacionados para el desarrollo de aplicaciones propias de Omniverse. El Kit SDK constituye el Software Development Kit fundamental, es decir, el marco sobre el que se basan las aplicaciones de Omniverse. El Kit App Template, en cambio, es un repositorio de plantillas de proyecto proporcionado por NVIDIA (en GitHub) que facilita a los desarrolladores el inicio en el desarrollo de aplicaciones con el Kit SDK.
El Omniverse Kit App Template es una plantilla de proyecto y colección de herramientas que se basa en el Kit SDK. NVIDIA proporciona plantillas preconfiguradas y código boilerplate para iniciar rápidamente aplicaciones o extensiones propias de Omniverse. Se puede ver el Kit App Template como una ayuda inicial: ofrece aplicaciones de ejemplo, estructuras de carpetas, scripts y un conjunto de herramientas que automatiza tareas comunes (p. ej. la carga del Kit SDK o la creación de una interfaz básica).
Al utilizar el Kit App Template, primero se clona el repositorio y luego se ejecuta un asistente incluido. Este „Wizard“ genera a partir de plantillas una nueva aplicación o extensión según la elección.
De este modo, los desarrolladores pueden, por ejemplo, crear con unos pocos comandos una aplicación de visualización mínima o una aplicación de edición más compleja, sin tener que escribir todo desde cero. El Kit App Template abstrae gran parte de la complejidad y ofrece varios puntos de partida, entre otros:
- Kit Base Editor: aplicación de editor minimalista con vista de escena USD básica.
- USD Composer: plantilla de aplicación extensa para la creación (authoring) de escenas OpenUSD complejas (similar a la aplicación oficial USD Composer).
- USD Viewer: aplicación de visualización simplificada (solo viewport), ideal para transmitir en un navegador web.
- Kit Service: aplicación de servicio sin interfaz (headless), p. ej. para backends en la nube.
¿Cómo inicio una aplicación de Omniverse mediante el SDK?
Para ejecutar localmente el ejemplo del vídeo, primero debemos descargar el Omniverse Kit SDK:
https://developer.nvidia.com/omniverse
Proyectos individuales como «Factory Planning 3D Sample Asset» podemos obtenerlos aquí:
https://developer.nvidia.com/usd#section-samples-and-examples
A continuación, podemos ejecutar Omniverse localmente y cargar el archivo USD de la fábrica:


Crear aplicación / extensión propia mediante el Omniverse Kit App Template
Los pasos necesarios se pueden encontrar en la siguiente página:
https://github.com/NVIDIA-Omniverse/kit-app-template
Resumen del procedimiento en Windows para crear un nuevo proyecto:
Al crear un nuevo proyecto con la plantilla Omniverse Kit puedes elegir entre dos opciones:
Application: para una aplicación de Omniverse independiente y totalmente configurable – o
Extension: para una extensión modular que añada nuevas funciones específicas a aplicaciones existentes.

Una Application es una aplicación completa basada en Omniverse Kit. Es como un programa propio que reúne todas las Extensions y configuraciones deseadas.
Application
Características de una Application:
- Define la estructura principal de una aplicación.
- Establece qué Extensions se cargarán.
- Incluye scripts de inicio, logotipos, tamaño de ventana, diseños, etc.
- Puede ejecutarse como aplicación independiente.
- A menudo se configura mediante un archivo .kit o .json.
Ámbitos de uso de las Applications:
- Un entorno de visualización propio para tus assets industriales.
- Una herramienta de revisión específica para ingenieros o arquitectos.
- Una aplicación propia para simulaciones o entrenamientos con IA.
Extension
Una Extension es un componente modular que puedes añadir a una aplicación de Omniverse existente. Extiende la funcionalidad sin modificar la aplicación principal.
Características de una Extension:
- Se escribe en Python/USD/C++.
- Puede proporcionar elementos de IU, herramientas, paneles, menús, lógica, etc.
- Es ligero y fácil de desarrollar.
- Puede activarse/desactivarse de forma independiente.
- Se guarda p. ej. en kit/exts o en extensions.
Ámbitos de uso de las Extensions:
- Una ventana de IU para cargar assets en la nube.
- Un botón para iniciar una simulación.
- Una integración con un servicio externo como Git, base de datos o MQTT.
Template
Después de seleccionar, por ejemplo, Application, se te preguntará qué plantilla quieres usar para tu nueva aplicación:

Ahora eliges una de varias plantillas de aplicación predefinidas que sirven de base para tu app. Cada una de estas plantillas incluye ciertas Extensions y funciones pensadas para casos de uso específicos.
| Template-Name | Beschreibung |
|---|---|
| [kit_base_editor] | Plantilla de editor mínima con funcionalidad básica. Ideal como punto de partida para una aplicación propia. Contiene elementos básicos de IU como ventanas, menús, logging, etc. |
| [omni_usd_composer] | Plantilla para escenarios creativos como creación de escenas, diseño e iluminación. Incluye herramientas para editar escenas USD, materiales, cámaras, etc. |
| [omni_usd_explorer] | Enfoque en la navegación e inspección de archivos USD. Sin enfoque de edición. Ideal para herramientas de revisión. |
| [omni_usd_viewer] | Más reducido que el Explorer. Visualizador USD puro sin herramientas de interacción. Ideal para “solo visualizar”. |
| [kit_service] | Para aplicaciones headless o backends de servidor. Sin IU. Bueno para procesos automatizados, servicios o pipelines. |
*.kit & *streaming.kit
Un archivo .kit (aaron_usd_composer.kit) es un archivo de configuración en formato JSON que define cómo se inicia tu aplicación de Omniverse. Es el punto de entrada de tu aplicación – comparable a una función main() en lenguajes de programación o a un package.json en Node.js.

El archivo *.kit contiene:
| Contenido | Descripción |
|---|---|
| app.exts | Lista de todas las extensiones que deben cargarse |
| ui | Definiciones de diseño, tamaños de ventana, temas |
| window | Título de ventana, icono, tamaño, pantalla completa, etc. |
| files | Qué escenas o assets se cargan al inicio |
| logging | Nivel de registro, formato de salida, rutas |
| settings | Ajustes personalizados, variables de entorno, tokens, etc. |
En Omniverse Kit, los llamados Streaming-Layer permiten ampliar una aplicación con funciones de acceso remoto y visualización en vivo.
El archivo (aaron_usd_composer_streaming.kit) es una variante de configuración especial que se basa en la aplicación principal y activa módulos adicionales para Pixel-Streaming y comunicación por WebSocket.
Permite desplegar la aplicación, p. ej., a través de la red o incluso en el navegador – ideal para entornos en la nube, colaboración remota o demostraciones interactivas.
Mediante la separación de la aplicación principal y la configuración de streaming, la arquitectura se mantiene modular y flexible: según las necesidades, la aplicación puede iniciarse localmente o en streaming.
Localmente, los archivos se encuentran, por ejemplo, en “C:\tools\omniverse\kit-app-template\source\apps”.
Setup Extension
La (aaron_usd_composer_setup_extension) es una Setup-Extension generada automáticamente que se encarga de que la aplicación se configure, inicialice y, si es necesario, extienda correctamente. Aquí se puede establecer el comportamiento predeterminado de la aplicación o insertar ajustes personalizados, flujos de trabajo o acciones de inicio.

La Setup Extension contiene:
| Archivo | Propósito |
|---|---|
| extension.toml | Metadatos (nombre, versión, dependencias, rutas) |
| main.py | Script en Python con la lógica de inicio de tu aplicación |
| ui/, data/, scripts/ | Opcional: assets, archivos de IU, iconos, etc. |
Local, la carpeta se encuentra aquí:
C:\tools\omniverse\kit-app-template\source\extensions\aaron_usd_composer_setup_extension
Application Layer
Los Application Layers en Omniverse no deben confundirse con los layers de escena (como en USD o Photoshop), sino que sirven para separar las configuraciones de forma modular y ordenada – comparable a los perfiles de entorno en proyectos de software clásicos.
Por ejemplo, cuando creas una aplicación de Omniverse, dispones de la llamada aplicación principal, que se guarda en un archivo .kit. En tu caso, ese archivo se llama aaron_usd_composer.kit. Contiene todo lo que tu aplicación necesita para funcionar: la interfaz de usuario, las Extensions, el comportamiento al iniciar, etc.
Sin embargo, es posible que desees que tu aplicación pueda transmitirse, esto es, mostrarse en el navegador o controlarse mediante conexiones WebSocket. Para ello, necesitas extensiones y configuraciones adicionales, como una interfaz WebSocket, módulos de streaming o servicios de red.
Sin embargo, estas funciones de streaming no se escriben directamente en el archivo de tu aplicación principal. ¿Por qué? Porque iría en contra del principio de separación entre configuración y funcionalidad. Si escribieras todo en un único archivo .kit, pronto tendrías una construcción poco manejable repleta de funciones que quizá no necesites en cada situación.
Y aquí es donde entran en juego los Application Layers.
Un Application Layer como omni_default_streaming.kit es un archivo de configuración predefinido por NVIDIA destinado únicamente a proporcionar funcionalidad de streaming. No contiene lógica de la aplicación ni IU – solo las Extensions y configuraciones relevantes para el streaming.
Así que, si al crear tu aplicación con repo.bat se te pregunta si deseas añadir “Application Layers” – y eliges, por ejemplo, “omni_default_streaming” – ello significa:
„Sí, quiero ampliar mi aplicación principal con esta capa adicional para poder transmitirla."
La consecuencia es que se genera un nuevo archivo .kit, p. ej., aaron_usd_composer_streaming.kit. Este archivo no es más que una combinación de:
- tu aplicación principal (aaron_usd_composer.kit)
- el Application Layer seleccionado (omni_default_streaming.kit)
Es, por tanto, un “wrapper” que, mediante la indicación extends, conecta ambos archivos .kit. Esto significa que, al iniciar aaron_usd_composer_streaming.kit, primero se carga tu aplicación y luego se “superpone” el layer de streaming. De este modo, tu aplicación adquiere todas las capacidades de streaming – pero sin que las integraras en la configuración principal.
Esta separación ofrece grandes ventajas: puedes iniciar tu aplicación en diferentes contextos, p. ej., con o sin streaming, con un layer de depuración o con un layer de nube – todo ello sin tener que modificar el archivo de la aplicación principal.
Esto es especialmente valioso si quieres desplegar una aplicación, por ejemplo, en distintos entornos: localmente durante el desarrollo, en la nube para presentaciones o en la red de la empresa para tu equipo. Solo necesitas iniciar diferentes archivos .kit, cada uno compuesto por tu aplicación más los layers adecuados.

Proceso de compilación
Antes de poder iniciar la aplicación de Omniverse con repo.bat launch, primero debemos construirla, es decir, compilarla o prepararla.

A continuación, la nueva aplicación se puede iniciar de la siguiente manera:


Cuando se crea una aplicación con el kit-app-template, la aplicación completa reside dentro de esa carpeta. Así, la carpeta del kit-app-template representa la estructura y el marco de la aplicación. Incluye, entre otros, la lógica de inicio (apps/my_app.py), archivos de configuración (config/*.kit), extensiones propias (extensions/) y recursos como imágenes, fuentes o shaders.
Por lo general, para cada nuevo proyecto se debe usar una copia propia del kit-app-template. Esto implica que, para cada aplicación o herramienta individual (p. ej., USD-Viewer, GUI de simulación, editor de materiales), se clona la carpeta de la plantilla y se adapta a los requisitos correspondientes. Así, cada proyecto permanece aislado y configurable de forma independiente. Además, es posible controlar y versionar de forma selectiva distintas opciones de inicio, Extensions y personalizaciones de IU.
¿Qué es Nucleus?
Omniverse Nucleus es el servidor de datos central dentro del ecosistema Omniverse. Sirve como plataforma común para el intercambio y la gestión de assets 3D – especialmente archivos USD, texturas, materiales y referencias. Aplicaciones como USD Composer, Isaac Sim o incluso Kit-Apps desarrolladas por uno mismo acceden a través de Nucleus a los mismos datos para poder trabajar de forma colaborativa y coherente.

Su funcionamiento se asemeja conceptualmente a un servicio de almacenamiento en la nube como Dropbox, pero está especialmente diseñado para flujos de trabajo 3D profesionales y el formato USD. En lugar de editar copias localmente, todas las herramientas conectadas trabajan directamente sobre la estructura del servidor – ya sea localmente o en la red. El acceso se realiza mediante el esquema de URI de Omniverse, p. ej., omniverse://localhost/Users/username/scene.usd.
Una ventaja esencial de Nucleus es la colaboración en vivo: varias aplicaciones – incluso distintas – pueden tener abierta la misma escena simultáneamente y sincronizar cambios casi en tiempo real. Además, Nucleus admite versionado, permisos, resolución de referencias y una gestión estructurada de archivos – esencial para producciones complejas con muchos participantes.
Importante: Nucleus no está pensado para almacenar o versionar código de aplicaciones (p. ej., Kit-Apps o scripts Python). Tales proyectos de desarrollo se mantienen localmente y se versionan normalmente con herramientas como Git o Subversion. No obstante, las aplicaciones pueden acceder a archivos en Nucleus mediante rutas omniverse:// – por ejemplo, para abrir, editar o guardar escenas USD.
La instalación local de Nucleus (p. ej., mediante el Omniverse Launcher) permite a individuos o pequeños equipos operar su propio servidor. En entornos empresariales, Nucleus también puede ejecutarse de forma centralizada en la red o como infraestructura de nube escalable. Gracias al comportamiento de actualización en vivo, el almacenamiento estructurado y el soporte nativo de USD, Nucleus es el componente clave para procesos de trabajo 3D conectados y dinámicos.
Omniverse se puede instalar localmente como Nucleus Workstation o en la nube mediante Omniverse Enterprise (de pago). En la Workstation local, todos los usuarios deben estar en la misma red o VPN, ya que se requiere acceso directo a los archivos. La variante en la nube ofrece más flexibilidad para equipos distribuidos, pero requiere una infraestructura centralizada, a menudo containerizada.
Nota: Nucleus se puede instalar hasta octubre de 2025 mediante el Omniverse Launcher:
https://install.launcher.omniverse.nvidia.com/installers/omniverse-launcher-win.exe
Manipular escenas USD en ejecución con Python
A continuación, se modifica una escena USD existente mediante código Python, como si un desarrollador externo o un sistema automatizado accediera a una escena compartida. El objetivo es manipular programáticamente elementos concretos dentro de la escena – por ejemplo, un cubo – como cambiar su escala. Este enfoque es típico en proyectos colaborativos donde múltiples participantes trabajan simultáneamente en distintos aspectos de una escena digital, o en canalizaciones automatizadas donde las escenas se adaptan regularmente mediante scripts.
Para editar escenas por programación, se utiliza el módulo pxr. Este módulo son los bindings de Python de la biblioteca USD (Universal Scene Description) de Pixar. El módulo proporciona funcionalidades centrales, como cargar y guardar archivos USD, crear o modificar Prims (elementos de la escena) y establecer transformaciones como posición, rotación o escala. Sin pxr, no es posible acceder al contenido de un archivo USD en Python.
Un malentendido común es suponer que un script Python externo puede acceder directamente a una aplicación de Omniverse que ya se esté ejecutando. En realidad, una aplicación en ejecución – por ejemplo una app personalizada basada en el Kit App Template – es un proceso separado con su propio contexto de memoria. Cuando se ejecuta un script externo como cube-scale.py, este también inicia un proceso propio con una nueva Stage de USD. Aunque ambas instancias carguen el mismo archivo .usd, técnicamente se trata de dos mundos completamente separados. El acceso directo a la escena interna de una aplicación en ejecución sólo es posible mediante comunicación entre procesos (IPC) específica, por ejemplo, a través de sockets, memoria compartida o llamadas a procedimientos remotos (RPC).
Una forma sencilla y, al mismo tiempo, potente de manipular escenas en vivo ofrece USD Composer. Se trata de una aplicación de Omniverse con interfaz gráfica completa, viewport y un Script Editor integrado. En este editor, se pueden ejecutar scripts Python directamente mientras la escena está cargada. Los cambios en objetos – como escalar un cubo – se hacen visibles de inmediato y pueden guardarse de forma permanente.



Incluso dentro de aplicaciones personalizadas basadas en el Kit App Template se puede activar un Script Editor de este tipo. Por defecto no está incluido en la versión base, pero puede integrarse mediante el archivo de configuración app.toml. Al añadir la línea “omni.kit.window.script_editor” = {} en la sección [dependencies], el Script Editor estará disponible en el siguiente inicio de la app y se podrá abrir desde el menú „Window“. De este modo, también es posible ampliar, probar y modificar escenas en aplicaciones propias de forma flexible – directamente en tiempo de ejecución y sin necesitar procesos externos.
API de Python de la Omniverse Client Library
La Omniverse Client Library (Python API) es una interfaz que permite a los desarrolladores comunicarse directamente desde Python con el sistema de archivos de Omniverse y la plataforma de NVIDIA Omniverse. Facilita el acceso a archivos y directorios que se encuentran localmente o en un servidor Omniverse Nucleus, así como suscribirse a cambios en archivos, escribir, leer, eliminar o comprobar permisos de acceso.
La API abstrae el protocolo de red subyacente y permite así un tratamiento unificado de recursos locales y remotos. Los desarrolladores pueden, por ejemplo, con pocas líneas de código leer archivos USD, obtener metadatos o recibir notificaciones cuando los archivos cambian – independientemente de si el archivo está en un disco local, en la nube o en un servidor Nucleus.
La Omniverse Client Library se utiliza normalmente en aplicaciones que trabajan con assets digitales: por ejemplo, para herramientas de diseño 3D, simulación, entrenamiento de IA, gemelos digitales o la integración de canalizaciones en estudios. La API de Python es especialmente adecuada para automatizaciones rápidas, paneles de control (dashboards), validación de contenido o como parte de flujos de trabajo más amplios, por ejemplo, junto con Omniverse Kit.
La API de Python de la Omniverse Client Library se encuentra en la siguiente URL:
https://docs.omniverse.nvidia.com/kit/docs/client_library/latest/docs/python.html#

Mostrar valor de sensor en un objeto 3D en vivo
Para mostrar datos de sensor en vivo en un modelo 3D, he combinado varias tecnologías: un sensor físico proporciona datos de medición – por ejemplo, un potenciómetro rotatorio que emite valores de -150 a +150. Estos datos de sensor se envían mediante el protocolo MQTT a un broker MQTT local. En mi caso, utilizo Mosquitto. El sensor publica sus datos a intervalos regulares (p. ej., cada segundo) en un topic MQTT determinado, en mi caso: sensor/rotary_poti. Los datos constan de payloads JSON simples como { “value”: 42 }.
Para supervisar el flujo de datos y obtener una visualización gráfica fuera del espacio 3D, he capturado los datos en paralelo con Node-RED. Node-RED me permite suscribirme al topic MQTT mediante flujos de datos lógicos de arrastrar y soltar y, por ejemplo, mostrar el valor en un panel de control (dashboard). Con ello, pude asegurar que mi sensor enviara correctamente y el broker MQTT reenviara los datos.
Sin embargo, el objetivo central era mostrar los datos del sensor dentro de un mundo 3D, es decir, hacer que un modelo 3D reaccione en vivo al valor del sensor. Para ello utilizo NVIDIA Omniverse USD Composer.
Los propios objetos 3D – es decir, las cifras del 0 al 9 así como el signo más y el signo menos – los modelé inicialmente en Blender. Blender desempeña en esta configuración el papel de herramienta de modelado: se utiliza para crear la forma de las cifras y los signos de forma puntual. La animación o visualización de estas formas la realiza la lógica Python en Omniverse, que copia, mueve y muestra los objetos según sea necesario.

Tras el modelado, exporté los objetos al formato USD o los importé en USD Composer.
La lógica que hace visibles estos objetos 3D y los modifica dinámicamente se basa en un script Python dentro de Omniverse. Este script se ejecuta en el Script Editor interno de USD Composer. Se conecta al broker MQTT mediante una biblioteca Python (paho-mqtt) y se suscribe al topic sensor/rotary_poti. En cuanto llega un nuevo valor, se procesa: el script calcula a partir del valor el signo y cada una de las cifras. Por ejemplo, el valor -128 se divide en cuatro elementos: el signo menos y las cifras 1, 2 y 8.
Para cada una de estas cuatro posiciones (slots), se carga el modelo 3D correspondiente y se sitúa de nuevo dentro de la escena. Esto significa que las cifras antiguas se eliminan y se reemplazan por otras, según cómo cambie el valor del sensor. Además, los objetos 3D no solo se seleccionan, sino que también se colocan y giran libremente para mostrarlos correctamente en una superficie, por ejemplo en una placa de visualización verde. Las posiciones y las rotaciones se pueden configurar individualmente para cada carácter, de modo que el diseño se pueda adaptar libremente.
Esta demostración muestra cómo se pueden vincular datos de medición reales con gemelos digitales o mundos 3D interactivos.
