View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Temas
  • Todos los videos
  • Información

Volver a WWDC25

  • Información
  • Resumen
  • Transcripción
  • Código
  • Novedades de RealityKit

    Da rienda suelta a tu creatividad con las nuevas funcionalidades de RealityKit para crear contenido 3D enriquecido para iOS, iPadOS, macOS, tvOS y visionOS. Descubre cómo puedes acceder a los datos de ARKit directamente a través de RealityKit. Explora cómo puedes interactuar con tu contenido 3D de forma más natural usando la funcionalidad de manipulación de objetos. Conoce algunas API nuevas para comprensión de escenas, combinación de entornos, creación de instancias y más, todo en una muestra interactiva.

    Capítulos

    • 0:00 - Introducción
    • 3:19 - Actualizaciones de anclaje
    • 6:52 - ManipulationComponent
    • 10:01 - Comprensión de escenas
    • 11:18 - EnvironmentBlendingComponent
    • 12:26 - MeshInstancesComponent
    • 16:28 - Medios envolventes
    • 21:43 - Accesorios y más

    Recursos

    • Playing immersive media with RealityKit
    • Presenting images in RealityKit
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Admite reproducción de video envolvente en apps de visionOS
    • Explora la entrada de accesorios espaciales en visionOS
    • Mejor juntos: SwiftUI y RealityKit
  • Buscar este video…

    Hola, soy Laurence, un ingeniero del equipo RealityKit. Te doy la bienvenida a “Novedades en RealityKit.” Hoy, veremos algunas de las nuevas funcionalidades de RealityKit de este año.

    Presentamos RealityKit en 2019, para que integres contenido 3D en tus apps, brindando una representación realista y mejorando las experiencias. Desde entonces recibimos muchos comentarios que nos ayudaron a mejorar esta estructura año tras año. RealityKit ofrece una variedad de capacidades para que tu contenido 3D combine con el mundo real, permitiéndote crear apps y juegos envolventes en visionOS. Además, RealityKit trae muchas funcionalidades clave a iOS, iPadOS y macOS. Con las capacidades multiplataforma de RealityKit, puedes escribir tu app y llevarla a muchas plataformas con cambios mínimos en el código. ¡Este año me enorgullece anunciar que RealityKit ahora es compatible con tvOS! ¡Ahora puedes llevar tus apps y experiencias al AppleTV o crear nuevas para la pantalla grande! RealityKit admite todas las generaciones del AppleTV 4K. La actualización de este año trae un conjunto amplio de funcionalidades que facilitan la creación de experiencias 3D que combinan el mundo virtual y el real. Te guiaré a través de algunas de estas funcionalidades, como ManipulationComponent, EnvironmentBlendingComponent, MeshInstancesComponent y más.

    Usaré algunas funcionalidades para crear un juego espacial. El juego comienza con un cofre cerrado que está anclado a una superficie. Alrededor de este cofre habrá varios objetos para interactuar. Uno de estos objetos tendrá la llave para abrir el cofre adherida en la parte inferior. Al agarrar e inspeccionar los objetos, podrás descubrir cuál tiene la llave. Una vez que tengas la llave, podrás desbloquear el cofre y ver tu premio:

    ¡fuegos artificiales!

    Usaré el nuevo soporte nativo de ARKit en RealityKit para anclar modelos al espacio frente al jugador y manejar cambios en el ciclo de vida del anclaje. Te mostraré cómo usar ManipulationComponent para agregar interacciones a entidades 3D en una escena. Usaré PhysicsBodyComponent para que caigan de manera realista cuando se suelten. Usaré las API SceneUnderstanding para que las entidades del juego colisionen con la malla de comprensión de escena.

    Después, usaré EnvironmentBlendingComponent para permitir que la app se integre mejor con el mundo real.

    Luego te mostraré cómo puedes usar MeshInstancesComponent para dibujar eficientemente múltiples instancias de un modelo 3D para decorar escenas. Repasaré algunas emocionantes actualizaciones de multimedia envolvente. También otros anuncios nuevos, como accesorios espaciales, actualizaciones de entidades y más. Comenzaré anclando modelos 3D al entorno del mundo real con una nueva API que da acceso a los datos de ARKit a través de RealityKit. Usaré un RealityKit AnchorEntity para posicionar mi juego en una mesa. Este se usa para adjuntar contenido virtual a superficies del mundo real. Hicimos que AnchorEntities sea más potente al exponer los datos de anclaje de ARKit directamente. Déjame mostrarte cómo se hace. Para tener acceso a los datos de ARKit a través de RealityKit, primero debes crear una SpatialTrackingSession. La configuración de la sesión le dirá a RealityKit que envíe AnchorStateEvents a tu app cuando cambien los estados de AnchorEntities. Luego puedes configurar un AnchorEntity para filtrar las propiedades del ancla que busques. En mi app quiero buscar una mesa con dimensiones específicas. Una vez que RealityKit encuentra la mejor ancla para las propiedades de AnchorEntity, activará un AnchorStateEvent. AnchorStateEvent contiene datos de ARKit, como la transformación y las extensiones del ancla, que puedo usar para posicionar mi juego. Repasemos esto en el código. Comenzaré creando una SpatialTrackingSession que rastreará las RealityKit AnchorEntities hasta el entorno. Necesito rastrear una superficie plana para el cofre, así que configuraré una sesión de SpatialTrackingSession con el seguimiento de planos habilitado.

    Ahora puedo iniciar la sesión de seguimiento con la configuración que hice. Puedo generar una AnchorEntity para posicionar mi juego en la mesa. Clasificaré AnchorEntity como una mesa de superficie horizontal con límites mínimos de 15 cm cuadrados asociados a ella. Esta AnchorEntity comenzará en un estado no anclado, pero se anclará cuando detecte un plano que coincida con la clasificación y los límites dados. Para recibir actualizaciones cuando cambie el estado, deberé usar la nueva API AnchorStateEvents.

    La API AnchorStateEvents permite suscribirse a eventos si las entidades se anclaron, si están a punto de desanclarse o si no se pudieron anclar. Usaré el evento DidAnchor para posicionar las entidades de mi juego dentro de los límites de la superficie.

    En mi código, agregué una suscripción al evento DidAnchor para saber cuándo la entidad de anclaje se ancló exitosamente al entorno. La estructura del evento me proporciona mi entidad de anclaje, que se actualizó para contener el nuevo ARKitAnchorComponent. Este componente contiene los datos de ARKit, que puedo usar para posicionar las entidades de mi juego en la superficie anclada. Puedo acceder a estos datos con la propiedad de anclaje de ARKitAnchorComponent.

    Para usarla, tendré que convertirla a su tipo de anclaje ARKit. Intentaré convertirla a PlaneAnchor ya que AnchorEntity está configurada para buscar planos.

    Ahora tengo acceso a las extensiones y transformaciones de ARKit para el ancla. Usaré las transformaciones de ARKit, originFromAnchorTransform y anchorFromExtentTransform, para posicionar mi juego y asegurarme de que esté centrado en la superficie. Cuando abro el espacio envolvente, se generarán objetos cuando encuentre una superficie adecuada.

    Agregaré interacciones a mi escena con el nuevo ManipulationComponent en RealityKit. ManipulationComponent simplifica el proceso de seleccionar y rotar las entidades 3D en la escena. ¡Incluso admite gestos avanzados como cambiar de mano!

    Usaré ManipulationComponent para permitir que el jugador agarre y gire los objetos del juego para encontrar la llave. Te mostraré cómo puedes agregar esta funcionalidad al juego, pero si quieres más información sobre el funcionamiento y uso de ManipulationComponent ve el video “Mejor juntos: SwiftUI y RealityKit”. Para poder seleccionar las entidades e interactuar con ellas, solo necesitas invocar a configureEntity de ManipulationComponent. Esta funcionalidad agregará automáticamente los componentes InputTarget, Collision, HoverEffect y Manipulation a la entidad. ¡Eso es todo! Ahora puedes tomar y rotar las entidades con tus manos. Pero notarás que los objetos vuelven suavemente a su lugar original cuando se sueltan.

    Volveré al código y estableceré releaseBehavior del ManipulationComponent en stay.

    Luego asignaré esta instancia modificationsComponent a mi entidad. Esto evitará que el objeto vuelva automáticamente a su posición cuando lo suelte. En lugar de eso, permanecerá quieto. Luego quiero hacerlo caer al suelo. Para eso agregaré PhysicsBodyComponent a mi entidad. Debo tener cuidado para habilitar la gravedad en PhysicsBodyComponent cuando el objeto no esté siendo manipulado. ¡La nueva API ManipulationEvents hace que esto sea fácil!

    Los ManipulationEvents son eventos emitidos por RealityKit que describen varios estados de interacción por los que pasan las entidades cuando se interactúa con ellas.

    Por ejemplo, el evento WillRelease se activará cuando el jugador libere una entidad. De manera similar, también hay otros eventos como WillBegin, WillEnd, DidUpdateTransform y DidHandOff. Lee la documentación en developer.apple.com para más detalles.

    Usaré los eventos WillBegin y WillEnd para asegurarme de que las entidades solo reaccionen a la gravedad cuando no se interactúe con ellas.

    Agregaré una suscripción al evento WillBegin para cambiar el modo physicsBodyComponent a cinemático para evitar que el sistema de física interfiera cuando se mueve el objeto. Esto también evitará que la gravedad afecte a la entidad.

    Luego, agregaré una suscripción al evento WillEnd para cambiar el modo physicsBodyComponent a dinámico cuando ya no se interactúa con la entidad. Hacer esto hará que la entidad reaccione a otros objetos físicos en la escena. ¡También responderá a la gravedad! Ahora que los objetos del juego responden a la física, necesito que colisionen con el entorno del jugador. Puedo hacer esto con la API de Comprensión de escenas que agrega la malla de mi habitación a la simulación física de la app. A través de la API SpatialTrackingSession, RealityKit puede generar una malla de su entorno. Esta malla, conocida como malla de Comprensión de escena, se puede usar para agregar colisión y física a los objetos del mundo real.

    Puedes usar la malla de comprensión de escena del entorno del mundo real configurando SceneUnderstandingFlags en la configuración de SpatialTrackingSession.

    visionOS ahora admite los indicadores de colisión y física. Usaré ambos para que los objetos de mi juego colisionen con la malla de comprensión de la escena. Estableceré estos indicadores en SpatialTrackingSession antes de ejecutarlo.

    Para esto, necesitaré actualizar la SpatialTrackingSession que configuré. Todo lo que tengo que hacer es agregar los indicadores de colisión y física a la configuración de SpatialTrackingSession antes de comenzar la sesión. Ahora, la malla de comprensión de la escena participará en la simulación de física del juego y los objetos colisionarán con el entorno cuando los deje caer en la mesa o el suelo.

    Ahora que mi juego puede interactuar con el entorno, quiero que también responda visualmente al entorno. Para esto puedo usar EnvironmentBlendingComponent. EnvironmentBlendingComponent es un nuevo componente para apps espaciales envolventes de la actualización de este año.

    Este permite que las entidades queden ocultas por objetos estáticos del mundo real. Las entidades con este componente quedan ocluidas de manera realista, ya sea parcial o total, según qué parte esté cubierta por un objeto del mundo real. Los objetos en movimiento, no ocluyen los objetos con este componente.

    Si quiero agregar esta funcionalidad, debo agregar EnvironmentBlendingComponent y configurar el modo de fusión preferido para que quede ocluido por el entorno. Si una entidad con EnvironmentBlendingComponent se posiciona detrás de un objeto del mundo real, notarás que la entidad quedará ocluida por él. Ten en cuenta que las entidades con EnvironmentBlendingComponent se tratarán como parte del entorno de fondo y siempre se dibujarán detrás de otros objetos virtuales en la escena. Ahora que EnvironmentBlendingComponent funciona, puedo agregar algunas decoraciones al juego usando el nuevo MeshInstancesComponent. El año pasado, se agregaron las API LowLevelMesh y LowLevelTexture para tener un mayor control de tus datos de renderizado. Este año, este acceso de bajo nivel se está ampliando a otro aspecto de la renderización: la instanciación. En mi app, quiero decorar el espacio alrededor y también definir un área de juego.

    Podría generar un montón de entidades duplicadas para decorar el espacio. Pero para hacer esto necesitaría clonar mi entidad muchas veces y crearía muchas copias de mi ModelComponent. Esto generaría un gran consumo de memoria y procesamiento. Una forma más eficiente y conveniente de hacer esto es usando el nuevo MeshInstancesComponent.

    MeshInstancesComponent permite dibujar una malla varias veces con una sola entidad. Solo debes proporcionar una lista de transformaciones para dibujar la malla. En iOS, iPadOS, macOS y tvOS puedes usar un LowLevelBuffer para pasar datos de renderizado a CustomMaterial para que cada malla se vea única. Además de ser conveniente, MeshInstancesComponent también puede mejorar el rendimiento al reducir la cantidad de datos que deben enviarse al GPU. En lugar de enviar varias copias del modelo y los materiales al GPU al dibujar mallas duplicadas, MeshInstancesComponent enviará esos datos una vez.

    Debes saber que los modelos que se dibujan con un solo MeshInstancesComponent se consideran parte de una sola entidad. Si usas este componente para un área grande, debes dividirlo en varias entidades más pequeñas para permitir que se realice la selección. Así se usa MeshInstancesComponent en el código. Necesito una malla para instanciar. La obtendré cargando una entidad del paquete de la app. Ahora, puedo inicializar MeshInstancesComponent y el objeto LowLevelInstanceData. El objeto LowLevelInstanceData es lo que contiene los datos de cada una de las mallas individuales. Cuando creo un objeto LowLevelInstanceData, tengo que proporcionar la cantidad de instancias que necesito. Usaré 20 aquí para mostrar una aproximación del área de juego sin sobrecargarla. Luego, puedo asignar el objeto LowLevelInstanceData al MeshInstancesComponent subscrito por el índice de la parte de malla que quiero instanciar. En mi caso, sé que la malla es simple y solo tiene una parte de malla, así que voy a asignar LowLevelDataObject a partIndex: 0.

    Ahora puedo rellenar el objeto LowLevelInstanceData con las transformaciones para cada instancia.

    Para tener decoraciones variadas, aleatorizaré la escala, el ángulo y la posición para cada una. Con estos valores puedo crear una matriz de transformación y asignarla a una instancia.

    Puedo agregar meshInstancesComponent a mi entidad y cada vez que se dibuje mi entidad, se dibujará usando los datos de MeshInstancesComponent.

    Con eso… ¡El juego está terminado!

    Puedes iniciar el juego y anclarlo a la superficie frente a ti. ¡Puedes tomar y girar los objetos en el área de juego para encontrar la llave que abre el cofre! Repasemos las nuevas API que usé para crear esta app. Usé las nuevas API AnchorStateEvent para anclar el contenido. Luego usé ManipulationComponent para permitir la interacción con objetos. Usé los indicadores de comprensión de escena para permitir que las entidades del juego colisionen con la malla. Finalmente, usé EnvironmentBlendingComponent y MeshInstancesComponent para que el juego se integrara con el mundo real. Compartiré otras funcionalidades que se agregan a RealityKit este año, como la compatibilidad con multimedia envolvente. Este año, presentamos un nuevo componente llamado ImagePresentationComponent que se usa para presentar imágenes en RealityKit. Admite tres tipos de imágenes: imágenes y fotos 2D tradicionales, fotos espaciales, estereoscópicas del iPhone o el Vision Pro, y escenas espaciales, un nuevo tipo de imagen 3D creada a partir de una imagen o foto 2D existente.

    Las escenas espaciales son imágenes 3D con profundidad, generadas de una 2D. Son como una versión diorama de una foto, con paralaje de movimiento para acentuar la profundidad a medida que los espectadores mueven la cabeza. Las escenas espaciales son una buena manera de dar vida a tus fotos 2D, tanto en la app Fotos de visionOS como en tu propia app, con RealityKit. Te mostraré el código para agregar los tres tipos de imágenes a tu app. Comenzaré mostrando cómo presentar una imagen o foto 2D con RealityKit.

    Primero encuentra una URL de una foto 2D y crea un nuevo componente de presentación de imagen. El inicializador del componente es asincrónico, puede tardar un poco en cargar la imagen en la memoria. Una vez inicializado, puedo asignarlo a una entidad para mostrarlo en mi escena.

    Para presentar fotografías espaciales, hay un paso más. Debes asignar un modo de visualización para el componente antes de configurarlo en la entidad. Puedes especificar el modo de visualización verificando primero si la imagen lo admite. Si no especificas un modo de visualización o tu imagen no lo admite, ImagePresentationComponent presentará la imagen en un modo de visualización 2D o monoscópico, incluso si es una foto espacial. Para una presentación de fotografía espacial envolvente, usa el modo de visualización de SpatialStereoImmersive. Cuando crees un componente de presentación a partir de una fotografía espacial, ambos modos estarán disponibles. Las imágenes 2D y las fotos espaciales se cargan desde un archivo en el disco. Mostrar esta imagen como una escena espacial requiere pasos adicionales, porque debemos generar la escena espacial antes de presentarla. Te mostraré cómo generar y presentar una escena espacial en el código.

    Puedes generar una escena espacial con una imagen 2D o foto espacial. Si generas una escena espacial a partir de una foto espacial, solo uno de los canales se usará como imagen 2D para la conversión. Para crear una escena espacial, no inicialices ImagePresentationComponent desde la URL de la imagen. Puedes crear una Spatial3DImage desde la URL y usar la imagen 3D espacial para inicializar ImagePresentationComponent. El componente aún no está listo para presentarse como una escena espacial, primero debes generar la escena.

    Para esto invocas al método de generación de la imagen 3D espacial. Esto generará la escena espacial en unos segundos. Después de la generación, los modos de visualización de ImagePresentationComponent se actualizarán para incluir spatial3D y spatial3DImmersive. Puedes configurar uno de ellos como el modo de visualización para una presentación en ventana o envolvente de la escena espacial. No es necesario generar la escena espacial de antemano. Quizás quieras esperar hasta que la persona que usa tu app presione un botón, como en Fotos. Establecer el modo de visualización deseado en .spatial3D antes de invocar generate le indica al componente que debe mostrar la escena espacial cuando esté lista. Esto hace que el componente muestre una animación de progreso durante la generación y que muestre la escena espacial cuando se completa la generación. Aquí hay un ejemplo de cómo se ve en el Vision Pro. El componente de presentación de imágenes muestra la misma animación de generación que Fotos en visionOS y el resultado se ve excelente en 3D.

    Estas son las formas en que puedes usar ImagePresentationComponent para presentar una imagen 2D, una foto espacial o una escena espacial. Para más información sobre esto, consulta el código de muestra “Presentación de imágenes en RealityKit” en developer.apple.com.

    Otra actualización de este año es que VideoPlayerComponent ahora admite la reproducción de una amplia gama de formatos de video envolvente. Admite la reproducción de video espacial con estilo espacial completo, en modo portal y envolvente.

    ¡También videos de Apple Projected Media Profile, como videos de 180 grados, 360 grados y de campo de visión amplio! Las personas también pueden configurar ajustes de comodidad para videos con Apple Projected Media Profile, y RealityKit ajustará la reproducción para adaptarse.

    Estos formatos de video, y Apple Immersive Video, se pueden configurar para reproducirse en varios de modos de visualización. Para conocer más de estas actualizaciones, consulta “Compatibilidad con reproducción de video envolvente en apps de visionOS”.

    Te comentaré sobre otras novedades de este año. Presentaré los Accesorios espaciales con seguimiento. Repasaré las actualizaciones con la integración de SwiftUI y RealityKit. Hablaré de las nuevas actualizaciones de entidades. Daré una descripción general del soporte de texturas AVIF de RealityKit. Analizaré la funcionalidad groupID del efecto de desplazamiento. Por último hablaré de la adición de efectos de postprocesamiento a RealityViews. Empecemos. RealityKit agregará compatibilidad con el seguimiento de accesorios espaciales que te permiten interactuar con tus apps en espacio compartido o completo. Puedes seguir accesorios espaciales en seis grados de libertad y admiten respuestas hápticas para mejorar las interacciones en apps y juegos. Para más información de cómo agregar entrada de accesorios espaciales, consulta “Explora la entrada de accesorios espaciales en visionOS.” RealityKit también presenta algunos componentes nuevos para permitir una mejor integración de SwiftUI. ViewAttachmentComponent hace que sea fácil agregar vistas SwiftUI directamente a tus entidades. PresentationComponent permite agregar presentaciones modales, como ventanas emergentes, a las entidades, y GestureComponent simplifica el proceso de agregarles gestos SwiftUI. Consulta “Mejor juntos: SwiftUI y RealityKit” para más información sobre las novedades en la integración de SwiftUI y RealityKit este año.

    También hay un nuevo método para adjuntar entidades que permite unir una entidad al pin de otra. Esta API simplifica la unión de mallas a las articulaciones de un esqueleto animado. Unir mallas de esta forma evita alinearlas manualmente y evita costosas actualizaciones jerárquicas de transformaciones. Hay un nuevo inicializador de Entity que permite cargar entidades desde objetos Data en memoria. Con este nuevo inicializador, puedes cargar escenas completas de RealityKit o archivos USD desde una fuente en línea o por la red. El nuevo inicializador admite los mismos formatos que los de entidades existentes.

    RealityKit está incorporando soporte para texturas codificadas en AVIF, que ofrecen una calidad similar a JPEG con soporte para colores de 10 bits y un tamaño más reducido. Puedes usar la app Vista previa en la Mac o usdcrush en la Terminal para exportar USD con esta compresión habilitada. HoverEffectComponent tiene una nueva funcionalidad: GroupID. Los GroupID crean asociaciones entre efectos de desplazamiento. Los efectos de desplazamiento que compartan GroupID, compartirán activaciones. Asignar un GroupID a los efectos de desplazamiento te brindará control total sobre cómo se activan, independientemente de su jerarquía relativa entre sí. Normalmente, se aplican de forma jerárquica, como en el ejemplo de la izquierda, donde las entidades secundarias heredan los efectos de las principales. Sin embargo, si una entidad tiene un GroupID como Entity A y Entity B, en el ejemplo de la derecha, entonces no propagan sus efectos a las secundarias.

    Otra incorporación es la admisión de efectos de posprocesamiento en RealityView. Puedes usar la API customPostProcessing para agregar efectos personalizados, como relieve, a tus apps con Metal Performance Shaders, CIFilters o sombreadores. Esta API es compatible con iOS, iPadOS, macOS y tvOS.

    La actualización de RealityKit se centra en hacer que la creación de experiencias 3D sea más fácil que nunca. Expliqué cómo crear un juego espacial con algunas de las nuevas API de RealityKit para anclar el juego a tu entorno y habilitar formas intuitivas de interactuar con las piezas del juego. También hablé de las nuevas actualizaciones de multimedia envolvente que hacen que tus apps muestren contenido espacial en RealityKit.

    Expliqué algunas actualizaciones adicionales, como seguimiento de accesorios espaciales, actualizaciones de entidades y groupsID de efectos de desplazamiento. Con estas nuevas funcionalidades es más fácil que nunca crear apps 3D con RealityKit, y me entusiasma ver qué experiencias se te ocurren.

    • 4:33 - Set up SpatialTrackingSession

      // Set up SpatialTrackingSession
      @State var spatialTrackingSession = SpatialTrackingSession()
      
      RealityView { content in
                   
          let configuration = SpatialTrackingSession.Configuration(
              tracking: [.plane]
          )
      		// Run the configuration
          if let unavailableCapabilities = await spatialTrackingSession.run(configuration) {
              // Handle errors
          }
      }
    • 4:34 - Set up PlaneAnchor

      // Set up PlaneAnchor
      RealityView { content in
      
      		// Set up the SpatialTrackingSession
      
          // Add a PlaneAnchor
          let planeAnchor = AnchorEntity(.plane(.horizontal,
                                                classification: .table,
                                                minimumBounds: [0.15, 0.15]))
          content.add(planeAnchor)
      }
    • 5:48 - Handle DidAnchor event

      // Handle DidAnchor event
      
      		didAnchor = content.subscribe(to: AnchorStateEvents.DidAnchor.self) { event in
      
      		guard let anchorComponent =
                 event.entity.components[ARKitAnchorComponent.self] else { return }
      
      
      		guard let planeAnchor = anchorComponent.anchor as? PlaneAnchor else { return }
      
      		let worldSpaceFromExtent =
          planeAnchor.originFromAnchorTransform *
          planeAnchor.geometry.extent.anchorFromExtentTransform
      
          gameRoot.transform = Transform(matrix: worldSpaceFromExtent)
      
          // Add game objects to gameRoot 
      }
    • 7:38 - Set up ManipulationComponent

      // Set up ManipulationComponent
      extension Entity {
          static func loadModelAndSetUp(modelName: String,
                                        in bundle: Bundle) async throws -> Entity {
      
              let entity = // Load model and assign PhysicsBodyComponent
              let shapes = // Generate convex shape that fits the entity model
      
              // Initialize manipulation
              ManipulationComponent.configureEntity(entity, collisionShapes: [shapes])
              var manipulationComponent = ManipulationComponent()
              manipulationComponent.releaseBehavior = .stay
              entity.components.set(manipulationComponent)
      
              // Continue entity set up
          }
      }
    • 9:28 - Subscribe to willBegin ManipulationEvent

      // Subscribe to ManipulationEvents
      
      // Update the PhysicsBodyComponent to support movement
      willBegin = content.subscribe(to: ManipulationEvents.WillBegin.self) { event in
          if var physicsBody = event.entity.components[PhysicsBodyComponent.self] {
              physicsBody.mode = .kinematic
              event.entity.components.set(physicsBody)
          }
      }
    • 9:29 - Subscribe to willEnd ManipulationEvent

      // Subscribe to ManipulationEvents
                      
      // Update the PhysicsBodyComponent to be a dynamic object
      willEnd = content.subscribe(to: ManipulationEvents.WillEnd.self) { event in
          if var physicsBody = event.entity.components[PhysicsBodyComponent.self] {
              physicsBody.mode = .dynamic
              event.entity.components.set(physicsBody)
          }
      }
    • 10:52 - Set up Scene understanding mesh collision and physics​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

      // Set up Scene understanding mesh collision/physics
      
      let configuration = SpatialTrackingSession.Configuration(
          tracking: [.plane],
          sceneUnderstanding: [.collision, .physics]
      )
    • 11:56 - Set up EnvironmentBlendingComponent

      // Set up EnvironmentBlendingComponent
      
      entity.components.set(
          EnvironmentBlendingComponent(preferredBlendingMode: .occluded(by: .surroundings))​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
      )
    • 14:20 - Set up MeshInstancesComponent

      // Set up MeshInstancesComponent entity
      
      let entity = try await ModelEntity(named:"PebbleStriped.usdz")
      var meshInstancesComponent = MeshInstancesComponent()
      let instances = try LowLevelInstanceData(instanceCount: 20)
      meshInstancesComponent[partIndex: 0] = instances
          
      instances.withMutableTransforms { transforms in
          for i in 0..<20 { 
              let scale: Float = .random(in:0.018...0.025)
              let angle: Float = .random(in:0..<2) * .pi
              let position = randomPoint(in: inArea, with: scene)
              let transform = Transform(scale: .init(repeating: scale),
                                        rotation: .init(angle: angle,axis: [0, 1, 0]),
                                        translation: position)
              transforms[i] = transform.matrix
          }
      }
              
      entity.components.set(meshInstancesComponent)
    • 17:36 - Load and display a 2D photo

      // Load and display a 2D photo
          
      guard let url = Bundle.main.url(forResource: "my2DPhoto", withExtension: "heic") else {a​​​​​​​​​​​​​​​​​​​​​​​​​​
          return
      }
      
      let component = try await ImagePresentationComponent(contentsOf: url)
      
      let entity = Entity()
      entity.components.set(component)
    • 17:57 - Load and display a spatial photo with windowed presentation

      // Load and display a spatial photo with windowed presentation
          
      guard let url = Bundle.main.url(forResource: "mySpatialPhoto", withExtension: "heic") else {
          return
      }
      
      var component = try await ImagePresentationComponent(contentsOf: url)
      
      // Discover if the component supports windowed spatial photo presentation.
      if component.availableViewingModes.contains(.spatialStereo) {
          component.desiredViewingMode = .spatialStereo
      }
      
      entity.components.set(component)
    • 18:22 - Load and display a spatial photo with immserive presentation

      // Load and display a spatial photo with immersive presentation
          
      guard let url = Bundle.main.url(forResource: "mySpatialPhoto", withExtension: "heic") else {
          return
      }
      
      var component = try await ImagePresentationComponent(contentsOf: url)
      
      // Discover if the component supports immersive spatial photo presentation.
      if component.availableViewingModes.contains(.spatialStereoImmersive) {
          component.desiredViewingMode = .spatialStereoImmersive
      }
      
      entity.components.set(component)
    • 18:56 - Load a spatial photo and use it to generate and present a spatial scene

      // Load a spatial photo and use it to generate and present a spatial scene
          
      guard let url = Bundle.main.url(forResource: "mySpatialPhoto", withExtension: "heic") else {
          return
      }
      
      let spatial3DImage = try await ImagePresentationComponent.Spatial3DImage(contentsOf: url)
      var component = ImagePresentationComponent(spatial3DImage: spatial3DImage)
      
      try await spatial3DImage.generate()
      
      // Discover if the component supports windowed spatial scene presentation.
      if component.availableViewingModes.contains(.spatial3D) {
          component.desiredViewingMode = .spatial3D
      }
      
      entity.components.set(component)
    • 20:06 - Generating a spatial scene as needed

      // Load a spatial photo and use it to generate and present a spatial scene
          
      guard let url = Bundle.main.url(forResource: "mySpatialPhoto", withExtension: "heic") else {
          return
      }
      
      let spatial3DImage = try await ImagePresentationComponent.Spatial3DImage(contentsOf: url)
      var component = ImagePresentationComponent(spatial3DImage: spatial3DImage)
      
      component.desiredViewingMode = .spatial3D // (or .spatial3DImmersive)
      
      entity.components.set(component)
      
      try await spatial3DImage.generate()
    • 23:35 - Load entity from Data object​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

      // Load entity from Data object
          
      if let (data, response) = try? await URLSession.shared.data(from: url) {
          if let entity = try? await Entity(from: data) {
              content.add(entity)
          }
      }
    • 0:00 - Introducción
    • La estructura RealityKit, presentada en 2019, permite a los desarrolladores crear apps y juegos 3D inmersivos en varias plataformas de Apple, incluidas visionOS, iOS, iPadOS, macOS y ahora tvOS. A partir de los comentarios, la última actualización presenta varias características nuevas, como el acceso directo a los datos de ARKit, el ManipulationComponent para agregar interacciones a entidades 3D, el EnvironmentBlendingComponent para una oclusión perfecta en el mundo real y el MeshInstancesComponent para una representación eficiente de múltiples modelos 3D. Estas características se demuestran a través de la creación de un juego de rompecabezas espacial donde los jugadores interactúan con objetos para abrir un cofre, mostrando cómo RealityKit mejora la combinación de experiencias del mundo virtual y real.

    • 3:19 - Actualizaciones de anclaje
    • Con esta nueva API, puedes acceder directamente a los datos de ARKit a través de RealityKit, mejorando el poder de AnchorEntities. Al crear una SpatialTrackingSession con seguimiento de planos activado, puedes configurar AnchorEntities para filtrar superficies específicas del mundo real, como tablas con dimensiones mínimas. Cuando el sistema detecta una superficie coincidente, activa un AnchorStateEvent, que proporciona datos de ARKit, como transformaciones y extensiones. Estos datos se pueden utilizar luego para posicionar entidades con precisión en la superficie anclada, garantizando que estén centradas y alineadas con el espectador.

    • 6:52 - ManipulationComponent
    • En el espacio inmersivo, los objetos del juego aparecen en superficies adecuadas. El ManipulationComponent de RealityKit permite a las personas tomar, rotar e intercambiar manos con estas entidades 3D. Al llamar a la funcionalidad configureEntity, se agregan automáticamente los componentes necesarios. Para evitar que los objetos se restablezcan después de la liberación, establece la propiedad “releaseBehavior” en “stay”. Un PhysicsBodyComponent agregado hace que los objetos caigan al suelo. La API ManipulationEvents se utiliza para activar y desactivar la gravedad; la gravedad se activa cuando alguien suelta un objeto (evento WillEnd) y se desactiva cuando lo recoge (evento WillBegin), lo que permite interacciones realistas y, al mismo tiempo, mantiene el control durante la manipulación.

    • 10:01 - Comprensión de escenas
    • En visionOS, con la API Scene Understanding de RealityKit, puedes integrar el entorno del mundo real en la simulación física de un juego. Al utilizar la API SpatialTrackingSession, puedes generar una malla del entorno. Para que los objetos del juego colisionen con esta malla del mundo real, es necesario configurar SceneUnderstandingFlags para colisión y física en la configuración SpatialTrackingSession antes de iniciar la sesión. Esta actualización permite que los objetos del juego interactúen de forma realista con el entorno físico, como dejarlos caer sobre mesas o suelos.

    • 11:18 - EnvironmentBlendingComponent
    • Con la última actualización de RealityKit, puedes usar EnvironmentBlendingComponent en tus apps espaciales inmersivas para ocluir entidades virtuales con el entorno del mundo real. Al agregar este componente y configurar el modo de fusión, las entidades pueden ser ocluidas de manera realista por objetos estáticos del mundo real y crear una experiencia más fluida. Sin embargo, es importante tener en cuenta que estas entidades siempre se dibujan detrás de otros objetos virtuales en la escena y no serán ocluidas por objetos dinámicos en movimiento, como personas o mascotas.

    • 12:26 - MeshInstancesComponent
    • La última actualización de RealityKit también presenta MeshInstancesComponent, que mejora la eficiencia de renderizado y te permite dibujar una sola malla varias veces dentro de una entidad. Este nuevo componente reemplaza la necesidad de clonar entidades, reduciendo significativamente el uso de memoria y procesamiento. Al utilizar MeshInstancesComponent, puedes proporcionar una lista de transformaciones para cada instancia de malla, lo que permite apariencias únicas a través de CustomMaterials en plataformas compatibles. Este método mejora el rendimiento al optimizar la transferencia de datos del GPU. Al utilizar este componente para áreas grandes, para una selección adecuada, divídelo en entidades más pequeñas. Hay una demostración de cómo inicializar y rellenar MeshInstancesComponent con transformaciones aleatorias, creando un área jugable con decoraciones. Juntas, estas API, a saber, AnchorStateEvent, ManipulationComponent, sceneUnderstanding flags y EnvironmentBlendingComponent, permiten experiencias de realidad aumentada interactivas que combinan el mundo real.

    • 16:28 - Medios envolventes
    • RealityKit está recibiendo actualizaciones importantes este año, mejorando su compatibilidad con medios inmersivos. Con un nuevo componente, ImagePresentationComponent, puedes mostrar tres tipos de imágenes: imágenes 2D tradicionales, fotografías espaciales y escenas espaciales. Las escenas espaciales son una adición notable; son imágenes 3D generadas a partir de fotos 2D, creando un efecto similar a un diorama con paralaje de movimiento, lo que hace que las imágenes estáticas sean más atractivas. Para presentar escenas espaciales, se generan a partir de una imagen 2D o una fotografía espacial utilizando la clase Spatial3DImage y, luego, se configura el modo de visualización deseado. VideoPlayerComponent también se actualiza para admitir varios formatos de video inmersivo, incluidos videos espaciales, videos de Apple Projected Media Profile como videos de 180° y 360°, y Apple Immersive Video. Puedes reproducir estos videos en diferentes modos de visualización y puedes configurar ajustes de comodidad para los videos de Apple Projected Media Profile.

    • 21:43 - Accesorios y más
    • La actualización de RealityKit de este año mejora significativamente el desarrollo de apps 3D. Las actualizaciones clave incluyen lo siguiente: Accesorios espaciales: RealityKit ahora admite el seguimiento de accesorios espaciales en seis grados de libertad con respuestas hápticas, lo que permite interacciones más inmersivas en espacios compartidos y completos. Integración con SwiftUI: Los nuevos componentes, como ViewAttachmentComponent, PresentationComponent y GestureComponent, simplifican la adición de vistas SwiftUI, presentaciones modales y gestos a las entidades. Actualizaciones de entidades: Un nuevo método de unión de entidades simplifica la unión de mallas a esqueletos animados, y un inicializador permite cargar entidades desde objetos de datos en memoria, lo que admite la transmisión de escenas en línea y USD. Compatibilidad con texturas y efectos de desplazamiento: RealityKit ahora admite texturas codificadas AVIF para tamaños de archivo más pequeños sin comprometer la calidad. HoverEffectComponent se actualiza con GroupID, lo que permite un mayor control sobre las activaciones de efectos al pasar el mouse. Efectos de posprocesamiento: RealityViews ahora admite efectos de posprocesamiento, lo que te permite agregar efectos personalizados como bloom usando Metal Performance Shaders, CIFilter o sombreadores personalizados en iOS, iPadOS, macOS y tvOS.

Developer Footer

  • Videos
  • WWDC25
  • Novedades de RealityKit
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines