Как заставить RealityKit показывать только CollisionComponents? - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь увидеть CollisionComponents на моем ARView.

Я использовал .showPhysics как часть debugOptions, но так как у меня есть 20 объектов на экране, я сводил с ума все нормальные и цвет компонентов CollisionComponents неясен (в некоторой форме странного розового цвета).

Кто-нибудь знает, как представить только компоненты CollisionComponents без каких-либо дополнительных данных в составе .showPhysics?

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете расширить стандартную функциональность ARView RealityKit, используя простое расширение Swift:

import RealityKit
import ARKit

fileprivate extension ARView.DebugOptions {

    func showCollisions() -> ModelEntity {

        print("Code for visualizing collision objects goes here...")

        let vc = ViewController()

        let box = MeshResource.generateBox(size: 0.04)    
        let color = UIColor(white: 1.0, alpha: 0.15)    
        let colliderMaterial = UnlitMaterial(color: color)

        vc.visualCollider = ModelEntity(mesh: box,
                                   materials: [colliderMaterial])    
        return vc.visualCollider
    }
}

... и затем вызывать этот метод в ViewController при нажатии на экран:

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!

    let anchor = AnchorEntity()
    var ballEntity = ModelEntity()
    var visualCollider = ModelEntity()
    var sphere: MeshResource?

    @IBAction func onTap(_ sender: UITapGestureRecognizer) {

        sphere = MeshResource.generateSphere(radius: 0.02)

        let material = SimpleMaterial(color: .systemPink,
                                 isMetallic: false)

        ballEntity = ModelEntity(mesh: sphere!,
                            materials: [material])

        let point: CGPoint = sender.location(in: arView)

        guard let query = arView.makeRaycastQuery(from: point,
                                              allowing: .estimatedPlane,
                                             alignment: .any)
        else { return }

        let result = arView.session.raycast(query)

        guard let raycastResult = result.first
        else { return }

        let anchor = AnchorEntity(raycastResult: raycastResult)
        anchor.addChild(ballEntity)
        arView.scene.anchors.append(anchor)

        let showCollisions = arView.debugOptions.showCollisions()  // here it is
        ballEntity.addChild(showCollisions)

        ballEntity.generateCollisionShapes(recursive: true)
    }
}

Обратите внимание, это приблизительная визуализация. Этот код просто показывает вам путь к go.

enter image description here

...