Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 当锚重新出现在视频屏幕中时,使AR实体重新出现_Swift_Xcode_Arkit_Scene_Realitykit - Fatal编程技术网

Swift 当锚重新出现在视频屏幕中时,使AR实体重新出现

Swift 当锚重新出现在视频屏幕中时,使AR实体重新出现,swift,xcode,arkit,scene,realitykit,Swift,Xcode,Arkit,Scene,Realitykit,使用iOS14.2、XCode12.1、Swift5.3、 我在Xcode项目中的第一次AR体验运行得很好 在reality composer中,我定义了一个类型为“image”的锚点,并在其XY中心放置了一个3D对象。此外,我还添加了一个小的行为动画,使3D对象在触摸时翻转,并立即发送触摸通知事件。这一切在我的应用程序中运行得非常好 然而,我想做一些下一步,不知道如何实现这一点 特别是:下面列表中的第3步我不知道如何做: 轻触AR对象并使其翻转 使对象在翻转动画后消失 一旦相机再次移动到定位图

使用iOS14.2、XCode12.1、Swift5.3、

我在Xcode项目中的第一次AR体验运行得很好

在reality composer中,我定义了一个类型为“image”的锚点,并在其XY中心放置了一个3D对象。此外,我还添加了一个小的行为动画,使3D对象在触摸时翻转,并立即发送触摸通知事件。这一切在我的应用程序中运行得非常好

然而,我想做一些下一步,不知道如何实现这一点

特别是:下面列表中的第3步我不知道如何做:

  • 轻触AR对象并使其翻转
  • 使对象在翻转动画后消失
  • 一旦相机再次移动到定位图像(或定位对象)上,使对象重新显示
  • 步骤1和步骤2的代码可在下面找到

    我看到的问题是,对象永远不会重新出现-即使相机指向锚图像

    是否有任何方法可以让3D对象通过触摸而消失(或隐藏),并在再次将相机移向锚定图像(或锚定对象)时使其重新出现

    我找到了一个解决办法:

    翻转动画完成后隐藏实体对象(而不是像上面的示例中那样删除)

    这种隐藏是通过为entity.object设置
    isEnabled=false
    来完成的

    此外,还需要某种触发器来再次取消隐藏实体对象。 在这里,它是通过一个简单的目标动作手势点击方法完成的。当然,您可以选择不同的机制来取消实体对象的隐藏

    据我所知,如果给定的锚类型(如图像或对象)重新进入摄影机字段,则在现实中不可能触发测量

    以下是解决方案代码:

    import UIKit
    import RealityKit
    
    class MySceneViewController: UIViewController {
        
        @IBOutlet weak var arView: ARView!
        private var myEntity: Entity?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let myScene1Anchor = try! MyScene1.loadScene()
            
            arView.scene.anchors.append(myScene1Anchor)
            
            let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
            arView.addGestureRecognizer(tap)
    
            // Register an onAction handler for the notification
            // action "tearTouched" you created in Reality Composer
            myScene1Anchor.actions.tearTouched.onAction = handleTapOnEntity(_:)
        }
        
        @objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
            self.myEntity?.isEnabled = true
        }
        
        func handleTapOnEntity(_ entity: Entity?) {
            
            guard let entity = entity else { return }
            
            self.myEntity = entity
            self.myEntity?.isEnabled = false
        }
    }
    
    import UIKit
    import RealityKit
    
    class MySceneViewController: UIViewController {
        
        @IBOutlet weak var arView: ARView!
        private var myEntity: Entity?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let myScene1Anchor = try! MyScene1.loadScene()
            
            arView.scene.anchors.append(myScene1Anchor)
            
            let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
            arView.addGestureRecognizer(tap)
    
            // Register an onAction handler for the notification
            // action "tearTouched" you created in Reality Composer
            myScene1Anchor.actions.tearTouched.onAction = handleTapOnEntity(_:)
        }
        
        @objc func handleTap(_ sender: UITapGestureRecognizer? = nil) {
            self.myEntity?.isEnabled = true
        }
        
        func handleTapOnEntity(_ entity: Entity?) {
            
            guard let entity = entity else { return }
            
            self.myEntity = entity
            self.myEntity?.isEnabled = false
        }
    }