RealityKit实现摆件功能

其中AR效果是通过RealityKit实现的,其主要代码如下

        self.view.insertSubview(arView, belowSubview: entitySelectView)
        let config = ARWorldTrackingConfiguration() // 设置世界坐标系
        config.planeDetection = .horizontal // 设置检测水平面
        self.arView.session.run(config)

将物品对象添加到平面上

    // 定位,确定释放点在世界坐标系中的位置
    let location = session.location(in: arView)
        guard let result = self.arView.raycast(from: location, allowing: .estimatedPlane, alignment: .horizontal).first else {
            return UIDropProposal(operation: .copy)
        }
     // 加载模型对象并生成锚点   
      @available(iOS 15.0, *)
    func loadEntity(name: String) -> ARAnchor? {
        guard let raycastResult = self.raycastResult else {
            return nil
        }
        let anchor = ARAnchor(name: name, transform: raycastResult.worldTransform)
        let robotAnchor = AnchorEntity(anchor: anchor)
        // 同步加载
        do {
            let myModelEntity = try ModelEntity.load(named: name)
            robotAnchor.addChild(myModelEntity)
            self.arView.scene.addAnchor(robotAnchor)
            activityEntity = myModelEntity
                // 设置执行可用动画
            if let _ = myModelEntity.availableAnimations.first {
                myModelEntity.playAnimation(myModelEntity.availableAnimations[0].repeat())
            }
        } catch {
            return nil
        }
        return anchor
    }

func addAchor() {
        let planeMesh = MeshResource.generatePlane(width: 0.01, height: 0.01, cornerRadius: 0.01)
        let planeEntity = ModelEntity(mesh: planeMesh, materials: [planeMaterial])
        planeEntity.generateCollisionShapes(recursive: false)
        planeAnchor = AnchorEntity()
        planeAnchor.addChild(planeEntity)
        self.arView.scene.addAnchor(planeAnchor)
}

效果图:


output.gif

你可能感兴趣的:(RealityKit实现摆件功能)