Quiero lograr algo similar al método raycast de ARCore que toma un rayo arbitrario en las coordenadas del espacio mundial en lugar de un punto del espacio de la pantalla:
List<HitResult> hitTest (float[] origin3, int originOffset, float[] direction3, int directionOffset)
Veo que ARKit en sí mismo no tiene ese método, pero de todos modos, ¡quizás alguien tenga una idea!
Gracias.
En los marcos Apple RealityKit y ARKit, puede encontrar tres tipos principales de métodos Raycast
: ARView Raycast
, ARSession Raycast
y Scene Raycast
(o World Raycast). Todos los métodos escritos en Swift:
Este método de instancia realiza una proyección de rayos, donde se proyecta un rayo en la escena desde el centro de la cámara a través de un punto en la vista, y los resultados se devuelven inmediatamente. Puede usar este tipo de raycast en ARKit.
func raycast(from point: CGPoint, allowing target: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment) -> [ARRaycastResult]
Este método de instancia realiza un lanzamiento de rayos convexos contra toda la geometría de la escena para un rayo de un origen, dirección y longitud determinados.
func raycast(origin: SIMD3<Float>, direction: SIMD3<Float>, query: CollisionCastQueryType, mask: CollisionGroup, relativeTo: Entity) -> [CollisionCastHit]
Este método de instancia repite una consulta de emisión de rayos a lo largo del tiempo para notificarle sobre superficies actualizadas en el entorno físico. Puede usar este tipo de raycast en ARKit 3.5.
func trackedRaycast(_ query: ARRaycastQuery, updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
Este método de instancia de RealityKit también realiza un lanzamiento de rayos rastreados, pero aquí se proyecta un rayo en la escena desde el centro de la cámara a través de un punto en la vista.
func trackedRaycast(from point: CGPoint, allowing target: ARRaycastQuery.Target, alignment: ARRaycastQuery.TargetAlignment, updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
import RealityKit let startPosition: SIMD3<Float> = [3,-2,0] let endPosition: SIMD3<Float> = [10,7,-5] let query: CollisionCastQueryType = .all let mask: CollisionGroup = .all let raycasts: [CollisionCastHit] = arView.scene.raycast(from: startPosition, to: endPosition, query: query, mask: mask, relativeTo: nil) guard let rayCast: CollisionCastHit = raycasts.first else { return }
import ARKit let query = arView.raycastQuery(from: screenCenter, allowing: .estimatedPlane, alignment: .any) let raycast = session.trackedRaycast(query) { results in if let result = results.first { object.transform = result.transform } } raycast.stop()