-
Novidades do RealityKit
Dê asas à sua criatividade com os novos recursos do RealityKit que podem ajudar a criar conteúdo detalhado em 3D para iOS, iPadOS, macOS, tvOS e visionOS. Saiba como acessar dados do ARKit diretamente do RealityKit. Explore como você pode interagir com seu conteúdo 3D de forma mais natural usando o recurso de manipulação de objetos. Descubra algumas novas APIs para compreensão de cenas, combinação de ambientes, criação de instâncias e muito mais, tudo isso usando um exemplo interativo.
Capítulos
- 0:00 - Introdução
- 3:19 - Atualizações de ancoragem
- 6:52 - ManipulationComponent
- 10:01 - Compreensão de cenas
- 11:18 - EnvironmentBlendingComponent
- 12:26 - MeshInstancesComponent
- 16:28 - Mídias imersivas
- 21:43 - Acessórios e muito mais
Recursos
- Integrating virtual objects with your environment
- Presenting images in RealityKit
- Playing immersive media with RealityKit
Vídeos relacionados
WWDC25
-
Buscar neste vídeo...
-
-
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 - Introdução
O framework RealityKit, lançado em 2019, permite que desenvolvedores criem apps e jogos 3D imersivos em várias plataformas da Apple, incluindo o visionOS, o iOS, o iPadOS, o macOS e agora o tvOS. Com base nos feedbacks, a atualização mais recente apresenta vários novos recursos, como acesso direto a dados do ARKit, o ManipulationComponent para adicionar interações a entidades 3D, o EnvironmentBlendingComponent para oclusão perfeita do mundo real e o MeshInstancesComponent para renderização eficiente de vários modelos 3D. Isso é mostrado com a criação de um jogo de quebra-cabeça onde os jogadores interagem com objetos para desbloquear um baú, provando como o RealityKit melhora a integração de experiências virtuais e reais.
- 3:19 - Atualizações de ancoragem
Com essa nova API, você pode acessar os dados do ARKit por meio do RealityKit, aumentando o poder de AnchorEntities. Ao criar um SpatialTrackingSession com o rastreamento de plano ativado, você pode configurar AnchorEntities para filtrar superfícies do mundo real, como tabelas com dimensões mínimas. Quando o sistema detecta uma superfície, ele aciona um AnchorStateEvent, fornecendo dados do ARKit, como transformação e extensões. Então, esses dados podem ser usados para posicionar entidades na superfície ancorada, garantindo que estejam centralizadas e alinhadas ao usuário.
- 6:52 - ManipulationComponent
No espaço imersivo, objetos de jogo são gerados em superfícies adequadas. O ManipulationComponent no RealityKit permite que as pessoas peguem, girem e troquem essas entidades 3D de mãos. Chamar a função configureEntity adiciona automaticamente os componentes necessários. Para impedir que os objetos sejam redefinidos após a liberação, defina releaseBehavior como stay. Um PhysicsBodyComponent adicional faz os objetos caírem no chão. A API ManipulationEvents é usada para ativar e desativar a gravidade. Ela é ativada quando alguém solta um objeto (evento WillEnd) e desativada quando ele é coletado (evento WillBegin), permitindo interações realistas e mantendo o controle durante a manipulação.
- 10:01 - Compreensão de cenas
Além do visionOS, com a API Scene Understanding do RealityKit, você pode integrar o ambiente do mundo real à simulação física de um jogo. Ao utilizar a API SpatialTrackingSession, você pode gerar uma malha do seu entorno. Para que os objetos do jogo colidam com essa malha do mundo real, defina SceneUnderstandingFlags para colisão e física na configuração SpatialTrackingSession antes de iniciar a sessão. Essa atualização permite que os objetos do jogo interajam de forma realista com o ambiente físico, como colocá-los sobre mesas ou no chão.
- 11:18 - EnvironmentBlendingComponent
Com a atualização do RealityKit, você pode usar o EnvironmentBlendingComponent nos seus apps de espaço imersivo para permitir que entidades virtuais sejam ocluídas pelo ambiente do mundo real. Ao adicionar esse componente e definir o modo de mesclagem, as entidades podem ser ocluídas por objetos estáticos do mundo real, criando uma experiência mais fluida. É importante notar que essas entidades são sempre desenhadas atrás de outros objetos virtuais na cena e não serão ocluídas por objetos dinâmicos em movimento, como pessoas ou animais.
- 12:26 - MeshInstancesComponent
A atualização do RealityKit também lança o MeshInstancesComponent, que melhora a eficiência da renderização, permitindo que você desenhe uma única malha várias vezes em uma entidade. Esse novo componente substitui a necessidade de clonar entidades, reduzindo a memória e o espaço ocupado pelo processamento. Com o MeshInstancesComponent, você pode fornecer uma lista de transformações para cada instância de malha, permitindo aparências exclusivas com o CustomMaterials em plataformas compatíveis. Esse método melhora o desempenho otimizando a transferência de dados da GPU. Ao usar esse componente para grandes áreas, para o descarte adequado, quebre-o em entidades menores. Há uma demonstração de como inicializar e preencher o MeshInstancesComponent com transformações aleatórias, criando uma área jogável com decorações. Juntas, as APIs AnchorStateEvent, ManipulationComponent, sceneUnderstanding flags e EnvironmentBlendingComponent permitem experiências interativas de realidade aumentada integrada ao mundo real.
- 16:28 - Mídias imersivas
O RealityKit receberá atualizações significativas este ano, melhorando a compatibilidade com mídias imersivas. Com um novo componente, o ImagePresentationComponent, você pode exibir três tipos de imagens: imagens 2D tradicionais, fotos espaciais e cenas espaciais. As cenas espaciais são uma adição importante. São imagens 3D geradas de fotos 2D, criando um efeito de diorama com paralaxe de movimento que torna as imagens estáticas mais interessantes. Para apresentar cenas espaciais, gere-as usando uma imagem 2D ou uma foto espacial com a classe Spatial3DImage e defina o modo de visualização desejado. O VideoPlayerComponent também foi atualizado para aceitar vários formatos de vídeo imersivos, incluindo vídeos espaciais, Apple Projected Media Profile, como vídeos em 180° e 360°, e Apple Immersive Video. Você pode reproduzir esses vídeos em vários modos de visualização e definir ajuste de conforto para vídeos do Apple Projected Media Profile.
- 21:43 - Acessórios e muito mais
A atualização do RealityKit deste ano melhora muito o desenvolvimento de apps 3D. As principais atualizações incluem o seguinte. Acessórios espaciais: O RealityKit agora permite rastrear acessórios espaciais em seis graus de liberdade com resposta tátil, possibilitando interações mais imersivas em espaço compartilhado e total. Integração do SwiftUI: Novos componentes como ViewAttachmentComponent, PresentationComponent e GestureComponent simplificam a adição de views, apresentações modais e gestos para entidades do SwiftUI. Atualizações de entidades: Um método entity attach simplifica o ato de anexar malhas a esqueletos animados, e um inicializador permite carregar entidades de objetos de dados na memória, possibilitando cenas online e reprodução de arquivos USD. Compatibilidade com textura e efeito de foco: O RealityKit agora é compatível com texturas codificadas em AVIF para tamanhos menores sem perder qualidade. O HoverEffectComponent foi atualizado com GroupIDs, permitindo mais controle sobre as ativações do efeito de foco. Efeitos pós-processamento: Agora, RealityViews aceita efeitos pós-processamento para adicionar efeitos personalizados como bloom usando Metal Performance Shaders, CIFilters ou sombreadores personalizados no iOS, iPadOS, macOS e tvOS.