Как использовать методы Raycast в RealityKit? - PullRequest
1 голос
/ 19 февраля 2020

Существует три способа обнаружения пересечений в RealityKit фреймворке, но я не знаю, как использовать его в моем проекте.

1.

func raycast(origin: SIMD3<Float>, 
          direction: SIMD3<Float>, 
             length: Float, 
              query: CollisionCastQueryType, 
               mask: CollisionGroup, 
         relativeTo: Entity?) -> [CollisionCastHit]

2.

func raycast(from: SIMD3<Float>, 
               to: SIMD3<Float>, 
            query: CollisionCastQueryType, 
             mask: CollisionGroup, 
       relativeTo: Entity?) -> [CollisionCastHit]

3.

func convexCast(convexShape: ShapeResource, 
               fromPosition: SIMD3<Float>, 
            fromOrientation: simd_quatf, 
                 toPosition: SIMD3<Float>, 
              toOrientation: simd_quatf, 
                      query: CollisionCastQueryType, 
                       mask: CollisionGroup, 
                 relativeTo: Entity?) -> [CollisionCastHit]

1 Ответ

1 голос
/ 19 февраля 2020

Простое приведение к лучу

Если вы хотите узнать, как расположить модель, созданную в Reality Composer, в сцену RealityKit (с обнаруженной горизонтальной плоскостью) с использованием метода Ray-Casting , используйте следующий код:

import RealityKit
import ARKit

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!
    let scene = try! Experience.loadScene()

    @IBAction func onTap(_ sender: UITapGestureRecognizer) {

        scene.steelBox!.name = "Parcel"

        let tapLocation: CGPoint = sender.location(in: arView)
        let estimatedPlane: ARRaycastQuery.Target = .estimatedPlane
        let alignment: ARRaycastQuery.TargetAlignment = .horizontal

        let result: [ARRaycastResult] = arView.raycast(from: tapLocation,
                                                   allowing: estimatedPlane,
                                                  alignment: alignment)

        guard let rayCast: ARRaycastResult = result.first
        else { return }

        let anchor = AnchorEntity(world: rayCast.worldTransform)
        anchor.addChild(scene)
        arView.scene.anchors.append(anchor)

        print(rayCast)
    }
}

Обратите внимание на класс ARRaycastQuery. Этот класс происходит от ARKit, а не от RealityKit .

Convex-Ray-Casting

A Методы Convex-Ray-Casting, такие как raycast(from:to:query:mask:relativeTo:) - это способ считывания выпуклые формы вдоль прямой линии и остановка на самом первом пересечении с любой из форм столкновения в сцене. Метод Scene raycast() выполняет проверку попаданий для всех сущностей с collision shapes в сцене. Объекты без формы коллизии игнорируются .

Вы можете использовать следующий код для выполнения выпуклых лучей от начальной позиции к концу:

import RealityKit

let startPosition: SIMD3<Float> = [0, 0, 0]
let endPosition: SIMD3<Float> = [5, 5, 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 }

print(rayCast.distance)      /* The distance from the ray origin to the hit */
print(rayCast.entity.name)   /* The entity's name that was hit              */

Структура CollisionCastHit является результатом попадания при столкновении и живет в сцене RealityKit .

PS

Когда вы используете raycast(from:to:query:mask:relativeTo:) метод для измерения расстояния от камеры до объекта , не имеет значения, что такое ориентация ARCamera, имеет значение только то, каково его положение находится в мировых координатах.

...