-
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
- Integrating virtual objects with your environment
- Presenting images in RealityKit
- Playing immersive media with RealityKit
Videos relacionados
WWDC25
-
Buscar este video…
-
-
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) } } -
// 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.