Técnico

Nvidia Omniverse — Isaac Sim — Introducción a la descripción de Universal Scene

Share

En este blog, presentamos Universal Scene Description (USD), un poderoso marco que se ha convertido en la base para la creación y colaboración de contenido 3D. Exploramos cómo el USD permite una integración perfecta de las herramientas y los flujos de trabajo, revolucionando los sectores, desde la producción de películas y juegos hasta la robótica y la simulación con inteligencia artificial. Al mostrar su papel en NVIDIA Omniverse e Isaac Sim, destacaremos el potencial transformador del USD a la hora de crear entornos 3D inmersivos, escalables y colaborativos.

Leadtek AI Forum - 5 Things to Know About USD (Universal Scene Description)

Descripción universal de la escena (USD)

Las canalizaciones capaces de producir películas y juegos gráficos por ordenador suelen generar, almacenar y transmitir grandes cantidades de datos 3D, lo que denominamos «descripción de la escena». Cada una de las muchas aplicaciones que están colaborando entre sí (modelado, sombreado, animación, iluminación, efectos visuales, renderizado) suele tener su propia forma especial de descripción de escenas adaptada a las necesidades y flujos de trabajo específicos de la aplicación, que no es legible ni editable por ninguna otra aplicación. Pixar presentó Universal Scene Description (USD) como el primer software disponible para intercambiar y aumentar escenas 3D arbitrarias de forma robusta y escalable.

El USD organiza la información de forma estructurada mediante bloques de construcción denominados Prims. Cada uno Prim puede contener datos llamados Atributos y Relaciones a otros Prims, conocidos como Propiedades. Las relaciones definen jerarquías o dependencias. Todos estos Prims y sus contenidos se agrupan en una estructura de archivos denominada Capa. Las capas permiten a diferentes personas trabajar simultáneamente en el mismo activo o escena, al permitir que cada artista trabaje en su propio archivo. A Escenario es el resultado de combinar diferentes capas.

Glosario de USD

Prims

Un Prim se refiere a un bloque de construcción o elemento fundamental de una escena dentro del marco del USD. Prim es la abreviatura de «primitivo» y representa un objeto o entidad individual dentro de la jerarquía de escenas.

Un USD prim puede considerarse como un contenedor que contiene varios tipos de datos, atributos y relaciones. Representa un objeto o componente específico de una escena, como un modelo, una cámara, una luz o incluso un grupo de otros prismas. Los prismas se organizan en una estructura jerárquica y forman un gráfico de escena que representa las relaciones y transformaciones entre los objetos de la escena.

Cada prim en USD tiene un identificador único, conocido como ruta, que identifica su ubicación dentro del gráfico de la escena. La ruta normalmente incluye los nombres de todos los primos principales que conducen al prim específico. Por ejemplo, la ruta de un prim puede ser «/world/characters/characterA», lo que indica que es un elemento secundario del prim «CharacterA», que a su vez es un elemento secundario del prim «Characters», etc.

Los prims contienen varios atributos, como la posición, la rotación, la escala, la información del material y los datos de animación. Estos atributos definen las propiedades y características de los objetos que representan.

En resumen, un prim USD representa un objeto o componente individual dentro de una escena en el marco de descripción universal de escenas. Sirve como contenedor de datos, atributos y relaciones, y forma parte del gráfico de escena. Los prims están organizados jerárquicamente, tienen rutas únicas y permiten encapsular y compartir datos de manera eficiente dentro del ecosistema de OpenUSD.

Screenshot from 2022-10-04 20-11-18
Tipos Prim

Los prims tienen un tipo, que viene con un comportamiento y datos predeterminados. Algunos de ellos son:

  • Camera Prim: representa una cámara, con propiedades como la distancia focal, la apertura de la lente, etc.
  • Light Prim: representa diferentes tipos de luz (por ejemplo, DistantLight, que representa la luz emitida desde una fuente distante a lo largo del eje Z, como el sol).
  • Xform: representa una transformación en el espacio (traslación, rotación y/o escalado).
  • Material Prim: representa las propiedades superficiales de los objetos.

Capa

Una capa es una colección de Prims y sus propiedades que se pueden guardar o cargar desde el disco o la memoria. Como tal, puede considerarse una «jerarquía que se puede guardar».

Escenario

El resultado compuesto de abrir una capa. Todas las capas interactúan entre sí para producir una «imagen final». Las capas aún existen, se pueden editar, eliminar, reemplazar, etc. pero lo que ves es el resultado, y ese es el escenario en USD.

Ejemplo: Escena de un parque

  • Prim for a Tree
    • Atributos: Este árbol Prim tiene atributos como la altura (10 pies) y el color (verde). Estos valores pueden cambiar con el tiempo, por ejemplo, cuando el árbol crece o durante los cambios estacionales (por ejemplo, cuando se vuelven marrones en otoño).
    • Relaciones: El árbol puede tener relaciones que apunten a un prim del suelo, lo que indica dónde está plantado.
  • Prim para un banco
    • Atributos: Este banco Prim puede tener atributos como el material (madera) y el tamaño (6 pies de largo).
    • Relaciones: También puede vincular a una ubicación Prim que especifique su posición exacta en el parque.

Todos estos primos, como el árbol y el banco, junto con sus detalles, están organizados dentro de una capa. Esta estructura facilita la gestión y la actualización de la escena. Al combinar diferentes capas, se crea una representación completa conocida como escenario.

Activos digitales

Los activos 3D son los componentes esenciales de un gemelo digital, ya que representan objetos digitales con formas, materiales, iluminación, física y comportamientos relevantes precisos. Estos activos también pueden incorporar flujos de datos en tiempo real de fuentes internas o externas, similares a los objetos físicos equipados con sensores y dispositivos de IoT.

En NVIDIA Omniverse, la descripción universal de escena (USD) de código abierto de Pixar sirve como formato principal para la representación de activos. El USD ofrece un sólido marco de descripción de escenas con una API que admite la herencia compleja de propiedades, la creación de instancias, la estratificación, la carga diferida y una variedad de otras funciones clave. Además, Omniverse permite crear diferentes «variantes» para cada activo, lo que permite la distribución aleatoria de la apariencia, la posición, la orientación y el comportamiento de un activo para lograr escenas más realistas.

Los activos pueden importarse de las amplias bibliotecas de activos de Omniverse o crearse con herramientas de creación de contenido externas e integrarse en el ecosistema de Omniverse. NVIDIA Omniverse™ proporciona todas las herramientas necesarias para convertir activos desde y hacia USD de forma rápida y sencilla. Además, Omniverse ofrece una biblioteca completa de activos en USD específicos del sector que tú y tu equipo pueden utilizar para crear tu gemelo digital. Para obtener más información sobre los activos y el soporte de Omniverse, haga clic aquí.

Activos 3D

Los activos 3D son los componentes esenciales de un gemelo digital, ya que representan objetos digitales con formas, materiales, iluminación, física y comportamientos relevantes precisos. Estos activos también pueden incorporar flujos de datos en tiempo real de fuentes internas o externas, similares a los objetos físicos equipados con sensores y dispositivos de IoT.

En NVIDIA Omniverse, la descripción universal de escena (USD) de código abierto de Pixar sirve como formato principal para la representación de activos. El USD ofrece un sólido marco de descripción de escenas con una API que admite la herencia compleja de propiedades, la creación de instancias, la estratificación, la carga diferida y una variedad de otras funciones clave. Además, Omniverse permite crear diferentes «variantes» para cada activo, lo que permite la distribución aleatoria de la apariencia, la posición, la orientación y el comportamiento de un activo para lograr escenas más realistas.

Los activos pueden importarse de las amplias bibliotecas de activos de Omniverse o crearse con herramientas de creación de contenido externas e integrarse en el ecosistema de Omniverse. NVIDIA Omniverse™ proporciona todas las herramientas necesarias para convertir activos desde y hacia USD de forma rápida y sencilla. Además, Omniverse ofrece una biblioteca completa de activos en USD específicos del sector que tú y tu equipo pueden utilizar para crear tu gemelo digital. Para obtener más información sobre los activos y el soporte de Omniverse, haga clic aquí.

Introducción al USD en Python

Antes de leer esta sección, se recomienda encarecidamente leer primero Explorando NVIDIA Omniverse e Isaac Sim

pxr y omni.usd

En Python, puede trabajar con USD mediante el paquete usd-core, que se importa como pxr (Pixar). Además, Omniverse se basa en esto al proporcionar su propia versión llamada omni.usd, diseñada específicamente para el desarrollo en el entorno de Omniverse.

Si bien pxr y omni.usd son intercambiables, omni.usd está diseñado para Omniverse. Sirve para cargar e inicializar pxr y Omniverse USD Resolver, que permite abrir USD desde las URL de Omniverse/HTTP. Es probable que necesites usar pxr y omni.usd, según tus objetivos y requisitos específicos.

Ejemplos de código

Mueve un remilgado

Los siguientes fragmentos de código muestran cómo cargar una etapa existente, recuperar una primitiva (primitiva) y moverla. Dado que existen varios métodos para lograrlo, se proporcionan ejemplos en los que se utilizan ambos pxr y omni.usd. Además, hay una nota sobre cómo usar omni.usd en modo headless.

Uso de pxr

de pxr importar Usado, Gf

# Escenario abierto

stage = Usd.Stage.Open ('. /path/test.usd (')

# Obtenga el prim en prim_path

prim_path = «/mundo/my_PRIM»

my_prim = stage.getPrimatPath (prim_path)

si no my_prim.isValid ():

print (f"El prim en '{prim_path}' no existe.»)

más:

print («El prim en '{prim_path}' existe»).

# Obtenga su posición como GFVec3D

prim_pos = my_prim.getAttribute («xFormOp: traducir») .Get (0)

# # Definir nueva posición

paso = gf.vec3d (1, 1, 1)

new_pos = prim_pos + paso

# # Establezca su posición en la nueva posición

éxito = my_prim.getAttribute («xFormOp:Translate») .Set (new_pos, 0)

Observe que al leer/escribir la posición de mi_prim, estamos recibiendo el Atributo «traducir» de un X para MOP en my_prim. «.Get (0)» y «.Set (0)» se refieren al hecho de que un XForm puede contener varias operaciones de «traducción», y solo estamos obteniendo o configurando la primera.

Uso de omni.usd

El siguiente código asume que el escenario se abrió previamente en Omniverse.

importar omni.usd

de pxr importar GF, USDgeom

# Obtener el contexto predeterminado

contexto = omni.usd.get_context ()

# Abrir etapa actual

etapa = context.get_stage ()

# Listar todos los primos para confirmar la estructura

por remilgado en Etage.traverse ():

imprimir (prim.getPath ())

# Obtenga el prim en prim_path

prim_path = «/mundo/my_PRIM»

my_prim = stage.getPrimatPath (prim_path)

si my_prim.isValid ():

print («El prim es válido y se encontró»)

más:

print («El remilgado no es válido o no existe en la escena»).

# Obtenga su posición como GFVec3D

prim_pos = my_prim.getAttribute («xFormOp: traducir») .Get (0)

# # Definir nueva posición

paso = gf.vec3d (0.5, 0.5, 0.5)

new_pos = prim_pos + paso

# # Establezca su posición en la nueva posición

éxito = my_prim.getAttribute («xFormOp:Translate») .Set (new_pos, 0)

omni.usd también tiene un set_prop_val función que podría usarse para este propósito.

Uso de omni.usd en modo headless

Si la etapa no se cargó previamente (por ejemplo, cuando se trabaja en modo headless), es necesario iniciar primero el Omniverse Toolkit con una clase auxiliar llamada SimulationApp.

de omni.isaac.kit importar Aplicación de simulación

de omni.isaac.core.utils.stage importar plato_abierto

# Inicie Omniverse Toolkit: elija ejecutar sin cabeza

simulation_app = SimulationApp ({"headless»: Cierto})

# Etapa de carga

stage_path = "C:\Users\ov -user\ test.usd»

open_stage (stage_path)

# Ponte remilgado en un camino remilgado

de omni.isaac.core.utils importar prismas

prim_path = «Mundo/my_Prim»

my_prim = prims.get_prim_at_path (prim_path)

# Haz algo

#...

# Cerrar SimulationApp

simulation_app.close ()

Cada viaje de IA comienza con una conversación

Hablemos
Hablemos