
-
Explora la entrada de accesorios espaciales en visionOS
Descubre cómo puedes integrar accesorios espaciales en tu app. Muestra contenido virtual, interactúa con tu app, da seguimiento en el espacio y obtén información sobre las interacciones para obtener experiencias virtuales mejoradas en visionOS.
Capítulos
- 0:00 - Comenzar
- 2:41 - Crea una app de escultura
- 13:37 - Accesorios de seguimiento con ARKit
- 14:45 - Consideraciones de diseño
Recursos
Videos relacionados
WWDC25
WWDC24
- Build a spatial drawing app with RealityKit
- Create enhanced spatial computing experiences with ARKit
WWDC21
WWDC20
-
Buscar este video…
¡Hola! Soy Amanda Han, ingeniera del equipo RealityKit. En esta sesión, te mostraré cómo crear una app de escultura espacial en visionOS usando la nueva compatibilidad con accesorios espaciales. En visionOS, tenemos un potente paradigma de entrada basado primero en ojos y manos. Usando solo tus ojos y manos puedes navegar Apple Vision Pro sin esfuerzo. Ahora ampliamos la gama de experiencias que puedes crear en Vision Pro con herramientas que ofrecerán un control más fino, entrada mediante botones y respuesta háptica. Este año, añadimos compatibilidad con accesorios espaciales. Integramos dos accesorios espaciales: PlayStation VR2 Sense Controller y Logitech Muse.
El PlayStation VR2 Sense Controller es ideal para juegos: incluye botones, joystick y gatillo, incluso puede navegar por el sistema con gestos estándar como tocar.
Se rastrea en el espacio con tanta precisión que permite practicar deportes, como en Pickle Pro de Resolution Games.
El otro accesorio es Logitech Muse. Logitech Muse incorpora sensores de fuerza que permiten entrada variable en la punta y el botón lateral, además de una potente respuesta háptica.
Su precisión es perfecta tanto para apps de productividad como de creatividad. Aquí tienes un ejemplo con la app de escultura que construiré en esta sesión junto con la app Fotos abierta al lado. Puedes usar estos accesorios en apps de Full Space y de Shared Space. Rastreamos la posición y rotación de los accesorios espaciales combinando las cámaras de Apple Vision Pro con los sensores del propio accesorio. Puedes aprovechar la respuesta háptica táctil en tus apps y ampliar la inmersión. Te conectas a accesorios espaciales mediante la estructura Game Controller y accedes a los datos de anclaje usando RealityKit o ARKit. En esta sesión, aprenderás a emplear la entrada de accesorios espaciales en tus apps. Construiré una app de escultura usando una combinación de GameController, RealityKit y ARKit. Veremos cómo usar directamente ARKit para rastrear accesorios espaciales. Y, por último, abordaré algunas consideraciones de diseño.
Empecemos a crear la app de escultura. Comienza configurando el proyecto en Xcode.
Conéctate a un accesorio espacial mediante la estructura Game Controller. Muestra la herramienta de escultura de forma virtual. Empieza a interactuar con la app tallando arcilla virtual. Y muestra una barra de herramientas reactiva basada en datos de interacción del seguimiento. Comencemos con la configuración en Xcode.
Uso la estructura Game Controller para gestionar las conexiones con mis accesorios, así que añadiré compatibilidad con juegos espaciales en el plist a través del editor de funcionalidades de Xcode. Indicaré que admito mandos con seguimiento espacial marcando la casilla Spatial Gamepad.
Describiré cómo usaré el accesorio en el campo de descripción Accessory Tracking Usage del plist de la app.
Para la app de escultura escribiré “Tracking accessory movements to carve into virtual clay”. Las personas verán el mensaje emergente para aceptar el seguimiento del accesorio.
Vamos a rastrear uno de los accesorios. Los accesorios espaciales necesitan conexiones activas para transmitir datos de sensores inerciales, de modo que debo descubrir la conexión antes de crear la herramienta de escultura.
Utilizaré la estructura GameController para descubrir las conexiones con accesorios espaciales. Prestaré atención a los eventos de conexión y desconexión o iteraré sobre las conexiones actuales. Para más información sobre mandos, mira “Tap into virtual and physical game controllers”. Dos clases de Game Controller pueden admitir el seguimiento de accesorios espaciales: GCController y GCStylus. Representan, respectivamente, mandos y estiletes, y ambas cumplen el protocolo GCDevice.
No todos los mandos o estiletes admiten seguimiento espacial. te mostraré cómo comprobarlo en nuestra app de escultura. Es posible que el escultor digital no tenga conectados sus accesorios cuando la app se abra, por lo que tendré que prestar atención a cuando se conecten. Para los estiletes, atenderé la notificación push GCStylusDidConnect y obtendré el GCStylus. Para verificar que ese GCStylus admite seguimiento espacial, comprobaré que su productCategory sea Spatial Stylus. El accesorio también podría desconectarse durante el ciclo de vida de la app, los eventos de desconexión se implementan del mismo modo. Y, para usar la API de GCController, puedo reemplazar GCStylus por GCController y verificar que GCController tenga la productCategory Spatial Controller. Ya tengo la conexión, pero todavía no veo nada en mi accesorio. Mostremos una punta virtual en su extremo. En visionOS, la técnica para seguir la posición y orientación de un objeto en el espacio se llama anclaje. Tanto si usas RealityKit, ARKit o una combinación de ambos, el anclaje a accesorios está disponible en apps de Full Space y de Shared Space. La app de escultura empleará Shared Space, porque sé que abrir imágenes de referencia en otras apps, como Safari o Fotos, mientras esculpes resulta muy útil. Para proteger la privacidad, solo la app enfocada y autorizada puede seguir los movimientos del accesorio.
Cada accesorio etiqueta sus propias ubicaciones para el anclaje. El PS VR 2 Sense Controller etiqueta aim, grip y grip surface, mientras que Logitech Muse no etiqueta la zona de agarre y solo etiqueta aim. La app de escultura se ancla a la ubicación aim de cada accesorio espacial. Usaré un AnchorEntity de RealityKit para anclar contenido virtual a mi accesorio. Un AnchorEntity es una Entity que fija contenido virtual al mundo físico y puede interactuar con otros elementos de mi escena RealityKit. Veamos el anclaje en el código. Creo un AccessoryAnchoringSource a partir de un accesorio espacial
y apunto a la ubicación aim. Si el accesorio no admite esa ubicación, no anclo.
Luego, creo el AnchorEntity con destino accessory, la ubicación aim y el modo de seguimiento predicted.
El AnchorEntity está a la izquierda. El modo predicted utiliza un modelo sofisticado para prever dónde estará el accesorio en el momento en que se renderiza el contenido. Sin embargo, si haces movimientos bruscos, puede adelantarse demasiado. Se ve en el variograma 4, donde la posición prevista en púrpura no coincide con la posición real en gris. Úsalo para renderizado e interacciones de baja latencia. Emplea el modo continuous cuando necesites más precisión. Esto tiene mayor latencia, pero ofrece poses más precisas y no se adelanta. Para mi accesorio optaré por maximizar la capacidad de respuesta con el modo de seguimiento predicted, ya que en una app de escultura no espero movimientos bruscos de la mano. Ahora, tengo la punta virtual anclada al accesorio. Puede que luzca bien, pero la herramienta de escultura todavía no interactúa con el resto de la app. Quiero tallar la arcilla según la posición del accesorio y, además, proporcionar respuesta háptica. Para eliminar material necesito obtener la herramienta de escultura. El año pasado añadimos SpatialTrackingSession, que permite obtener las transformadas de los tipos de AnchorEntity configurados como objetivo. Este año hemos incorporado .accessory a la lista de configuraciones SpatialTrackingSession admitidas. Una vez que añada .accessory a la configuración de seguimiento espacial podré ejecutar la sesión y recibir las transformadas de cualquier AnchorEntity de accesorio. Si deseas obtener más detalles sobre SpatialTrackingSession, mira la charla de Adrian “Build a Spatial Drawing App with RealityKit”. Ahora añadamos sensación táctil a la escultura. Un accesorio espacial puede disponer de háptica, un excelente mecanismo de respuesta, así que la incluiré para que realmente se “sienta” la arcilla. Obtengo la interfaz de háptica del accesorio, creo un motor háptico y lo inicio.
Si necesitas más información sobre la configuración de patrones hápticos, consulta “Advancements in Game Controllers”. Veamos cómo tallar la arcilla usando mi herramienta para esculpir. Cuando el accesorio entra en la arcilla quito material y reproduzco la vibración háptica, lo que genera una experiencia inmersiva. A veces puedo retirar demasiado material de algunas partes de mi creación así como así, así que añadiré un modo de escultura aditiva. Mostraré una barra de herramientas que permita alternar entre modos de escultura y que aparezca en función de la interacción del usuario con su accesorio. La presentaré a la izquierda o a la derecha del accesorio, según la mano que lo sostenga. Para lograrlo puedo usar ARKit AccessoryAnchor. AccessoryAnchor ofrece cuatro propiedades: la propiedad handedness, que indica la mano que sujeta el accesorio, el movimiento relativo del accesorio en el espacio, la rotación relativa en ese mismo espacio y el estado de seguimiento. La calidad del seguimiento disminuye cuando los sensores o las cámaras tienen cobertura reducida.
Para casos específicos, como tomar medidas del mundo real con ayuda de accesorios espaciales, ARKit también expone una API que permite recibir transformadas de anclajes métricos. Para obtener más detalles consulta la API “Coordinate spaces” en la documentación. Volvamos a mi ejemplo. Necesito acceder al ARKit AccessoryAnchor, pero solo dispongo del AnchorEntity de RealityKit. Este año, RealityKit permite obtener anclajes de ARKit a partir de cualquier AnchorEntity si tienes en ejecución y configurada una SpatialTrackingSession. Configuro entonces una función para obtener el ARKit AccessoryAnchor desde un AnchorEntity de RealityKit. Simplemente accedo al ARKitAnchorComponent del AnchorEntity, obtengo su ARKitAnchor y lo convierto condicionalmente en un AccessoryAnchor. Si quieres saber más sobre ARKitAnchorComponent, escucha la charla de Laurence “What’s new in RealityKit”.
Mostremos la barra de herramientas. Obtengo el anclaje del accesorio de mi AnchorEntity con la función auxiliar que acabo de crear y uso la propiedad handedness para determinar la posición de la barra. Esa propiedad está almacenada en heldChirality del anclaje.
Si la propiedad handedness es izquierda, ubicaré la barra en x positivo; si es derecha, en x negativo. Si el accesorio no está en ninguna mano, no la desplazaré.
Veamos la barra reactiva en la app. Cuando pulso el botón con la mano derecha, aparece a la izquierda del accesorio. Puedo cambiar al modo aditivo y corregir el error que hice antes.
Eh... con eso basta. Recapitulemos. Creé una app de escultura inmersiva usando las nuevas API de accesorios espaciales. Usé GameController para conectar los accesorios, después, empleé API de RealityKit para crear la herramienta de escultura y mostré una barra de herramientas reactiva aprovechando las funcionalidades combinadas de RealityKit y ARKit. La app terminada luce y se siente muy bien Si prefieres trabajar directamente con ARKit, o si tu app tiene renderizado personalizado, existen API que te ofrecen la misma funcionalidad para el seguimiento de accesorios espaciales. Veámoslas. Resumiré los puntos clave de ARKit para el seguimiento con AccessoryTrackingProvider y la actualización de anclajes de accesorios. Usa un GCStylus o un GCController para crear un Accessory.
Emplea AccessoryTrackingProvider para seguir los objetos Accessory. Cuando un accesorio se conecta o se desconecta de tu app, debes gestionarlo de forma adecuada. Esto implica volver a ejecutar la sesión de ARKit con la configuración de accesorios actualizada.
Si quieres ver una implementación práctica, revisa la muestra de ARKit “Tracking accessories in volumetric windows”. Los accessory anchors funcionan parecido a hand anchors en patrones de actualización. Puedes elegir recibir actualizaciones precisas en un flujo continuo o usar predicción bajo demanda para ofrecer respuesta interactiva. Si deseas más información sobre la predicción en ARKit, mira “Create enhanced spatial computing experiences with ARKit”. Ya hemos repasado varias API interesantes para accesorios espaciales. Ahora, algunos aspectos de diseño que conviene tener en cuenta al crear tus apps. Comencemos con el uso de gestos para interactuar con la interfaz. Puedes indicar a una vista que reciba la entrada de un Game Controller (botones o gatillos) en lugar de gestos. Y ahora también puedes manejar a la vez los gestos de mano estándar y los controladores en tus vistas.
Aquí funciona esto en código. Primero, indicas a la vista SwiftUI que acepte eventos del Game Controller. Luego, le asignas la recepción de gestos con el modificador .receivesEventsInView.
Si el Game Controller cuenta con seguimiento espacial, tu gesto espacial incluirá la propiedad chirality, es decir, la mano con la que se sostiene el dispositivo.
En el caso de las apps que se ejecutan en Full Space, considera usar .persistentSystemOverlays para ocultar el indicador de inicio y .upperLimbVisibility para ocultar brazos y accesorios. Esto amplia la inmersión de apps y juegos. Los accesorios espaciales permiten nuevas y potentes formas de interactuar. Y para abarcar al mayor número posible de usuarios puedes ofrecer compatibilidad adaptativa tanto para accesorios espaciales como para manos.
ARKit rastrea las manos aún más rápido este año, de modo que ojos y manos siguen siendo una excelente forma de entrada.
Cuando quieras indicar que tu app admite mandos con seguimiento espacial, añade el distintivo “Spatial game controller support” en el App Store. Y si tu app los requiere de forma obligatoria, usa el distintivo “Spatial game controller required”. Consulta la documentación para conocer las claves que debes añadir al plist de tu app y mostrar cada distintivo. Terminemos esta sesión. Puedes adoptar accesorios espaciales para obtener control de entrada más preciso y respuesta háptica, e integrarlos mediante GameController, RealityKit y ARKit. Diseña siempre con soporte adaptativo para manos y accesorios. Esto es solo una muestra de las apps y juegos que puedes crear con accesorios espaciales. Estoy deseando ver lo que desarrollarás. ¡Que tengas un gran WWDC25!
-
-
0:09 - Get in-app transforms
// Get in-app transforms let session = SpatialTrackingSession() let configuration = SpatialTrackingSession.Configuration(tracking: [.accessory]) await session.run(configuration)
-
4:57 - Check for accessory support
// Check spatial accessory support NotificationCenter.default.addObserver(forName: NSNotification.Name.GCControllerDidConnect, object: nil, queue: nil) { notification in if let controller = notification.object as? GCController, controller.productCategory == GCProductCategorySpatialController { } }
-
7:20 - Anchor virtual content to an accessory
// Anchor virtual content to an accessory func setupSpatialAccessory(device: GCDevice) async throws { let source = try await AnchoringComponent.AccessoryAnchoringSource(device: device) guard let location = source.locationName(named: "aim") else { return } let sculptingEntity = AnchorEntity(.accessory(from: source, location: location), trackingMode: .predicted) }
-
9:45 - Add haptics to an accessory
// Add haptics to an accessory let stylus: GCStylus = ... guard let haptics = stylus.haptics else { return } guard let hapticsEngine: CHHapticEngine = haptics.createEngine(withLocality: .default) else { return } try? hapticsEngine.start()
-
11:25 - Access ARKit anchors from AnchorEntity
// Access ARKit anchors from AnchorEntity func getAccessoryAnchor(entity: AnchorEntity) -> AccessoryAnchor? { if let component = entity.components[ARKitAnchorComponent.self], let accessoryAnchor = component.anchor as? AccessoryAnchor { return accessoryAnchor } return nil }
-
-
- 0:00 - Comenzar
Esta sesión sobre el desarrollo de visionOS se centra en la creación de una app de escultura espacial usando la nueva compatibilidad con accesorios espaciales. visionOS ahora permite crear apps usando el control PlayStation VR2 Sense y Logitech Muse para un mejor control e inmersión. El control PS VR2 Sense, con sus botones, joystick y gatillo, es ideal para juegos y navegación, mientras que Logitech Muse, con sensores de fuerza y respuesta háptica, ayuda con las apps de productividad y creatividad. Esta sesión se centra en la creación de una app de escultura espacial usando la nueva compatibilidad con accesorios espaciales. visionOS ahora te permite crear apps usando el control PlayStation VR2 Sense y Logitech Muse para un mejor control e inmersión. El control PS VR2 Sense, con sus botones, joystick y gatillo, es ideal para juegos y experiencias interactivas divertidas, mientras que Logitech Muse, con sensores de fuerza y respuesta háptica, ayuda con las apps de productividad y creatividad. Conecta estos accesorios usando la estructura Game Controller y aprovecha RealityKit o ARKit para rastrear el movimiento y la rotación del accesorio. La sesión demuestra cómo crear una app de escultura y explora consideraciones de diseño para incorporar entradas de accesorios espaciales en apps de espacio completo y espacio compartido de visionOS.
- 2:41 - Crea una app de escultura
El proyecto de ejemplo crea la app de escultura configurando el proyecto de Xcode y la compatibilidad del controlador de juego espacial a través de una entrada plist. Luego, el proyecto usa la estructura Game Controller para descubrir y conectarse a accesorios espaciales. Una vez que se establece una conexión, la app ancla el contenido virtual a la ubicación Aim del accesorio usando RealityKit AnchorEntity. Esta técnica de anclaje permite mostrar una herramienta de escultura virtual que rastrea con precisión los movimientos del accesorio en el espacio. La app también maneja eventos de conexión y desconexión y usa el modo de seguimiento previsto para mejorar la representación del contenido virtual y garantizar una experiencia de escultura intuitiva y receptiva. Para habilitar interacciones con la arcilla virtual, la app necesita acceder a la transformación de la herramienta de escultura. Esto se logra a través de SpatialTrackingSession, que ahora admite el seguimiento de accesorios y permite que la app obtenga las transformaciones de cualquier AnchorEntity de accesorio. A continuación, el proyecto agrega tecnología háptica para ofrecer respuesta táctil y hacer que la experiencia de esculpir sea más envolvente. La app puede determinar qué mano sostiene el accesorio usando AccessoryAnchor de ARKit, que proporciona información sobre el movimiento relativo y el estado de seguimiento. Al combinar las API de RealityKit y ARKit, la app muestra una barra de herramientas reactiva que aparece según la lateralidad del usuario, lo que le permite alternar entre los modos de escultura. Esto mejora la experiencia del usuario y permite un control preciso sobre el proceso de esculpido.
- 13:37 - Accesorios de seguimiento con ARKit
Si estás creando una app con tu propia representación, ARKit ofrece API para rastrear accesorios espaciales, como GCStylus y GCController. Emplea AccessoryTrackingProvider para crear y manejar los objetos Accessory. Cuando los accesorios se conecten y desconecten, vuelve a ejecutar la sesión de ARKit con la nueva configuración. Los anclajes accesorios ofrecen actualizaciones similares a los anclajes manuales: puedes elegir entre actualizaciones precisas transmitidas o predicciones a pedido para obtener comentarios interactivos.
- 14:45 - Consideraciones de diseño
Se recomienda soporte adaptable para manos y accesorios espaciales a fin de lograr una máxima accesibilidad del usuario. ARKit ahora te permite integrar accesorios espaciales con controles de juegos para un mejor control de entrada y respuesta háptica en las vistas de SwiftUI. Usa el modificador receivesEventsInView para manejar tanto los gestos estándar de la mano como los eventos del control de juego. Puedes mostrar insignias del App Store para indicar compatibilidad con controles de juegos espaciales. Hay API disponibles para ocultar el indicador de inicio y las extremidades superiores, lo que aumenta la inmersión.