2017-06-07 111 views
11

我正在尝试ARKit,并使用this tutorial设置了ARSCNView用ARKit显示dae文件并跟踪场景中的锚点

然后设置跟踪水平3D平面与this tutorial.

第二部分我创建单个视图应用程序然后所约束的ARSCNView冲洗到根视图具有出口到我ViewController

这里是在ViewController代码:

import UIKit 
import ARKit 

class ViewController: UIViewController { 

    //MARK: Properties 
    @IBOutlet weak var arScene: ARSCNView! 

    //MARK: ARKit variables 
    var realityConfiguration: ARWorldTrackingSessionConfiguration? 

    //MARK: Lifecycle 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     self.prepare() 
    } 

    //MARK: Actions 


    //MARK: Overrides 
} 

extension ViewController { 
    func prepare() { 
     //Check to see if active reality is supported 
     guard ARSessionConfiguration.isSupported else { 
      //Custom alert function that just quickly displays a UIAlertController 
      AppDelegate.alert(title: "Not Supported", message: "Active Reality is not supported on this device") 
      return 
     } 
     //Set up the ARSessionConfiguration 
     self.realityConfiguration = ARWorldTrackingSessionConfiguration() 
     //Set up the ARSCNView 
     guard let config = self.realityConfiguration else { 
      return 
     } 
     //Run the ARSCNView and set its delegate 
     self.arScene.session.run(config) 
     self.arScene.delegate = self 
    } 
} 

extension ViewController: ARSCNViewDelegate { 
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { 
     return nil 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { 
     guard let planAnchor = anchor as? ARPlaneAnchor else { 
      return 
     } 

     let plane = SCNPlane(width: CGFloat(planAnchor.extent.x), height: CGFloat(planAnchor.extent.z)) 
     let planeNode = SCNNode(geometry: plane) 
     planeNode.position = SCNVector3Make(planAnchor.center.x, 0, planAnchor.center.z) 

     planeNode.transform = SCNMatrix4MakeRotation(-Float.pi/2, 1, 0, 0) 

     node.addChildNode(planeNode) 

    } 

    func renderer(_ renderer: SCNSceneRenderer, willUpdate node: SCNNode, for anchor: ARAnchor) { 
     print("Will updated Node on Anchor: \(anchor.identifier)") 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { 
     print("Did updated Node on Anchor: \(anchor.identifier)") 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) { 
     print("Removed Node on Anchor: \(anchor.identifier)") 
    } 
} 

我下载的Xcode 9测试版,随后苹果教程,实现了我的手机(iPhone 6)没有为ARWorldTrackingSessionConfiguration对象所需的A9芯片。

大约在我链接的第一篇教程中,Apple说你仍然可以在没有A9芯片的情况下创建AR体验。但是,他们没有进一步详细说明。有没有其他人发现了一个出发点,并愿意提供使用.dae文件和

  • 选择一个锚点,以显示它
  • 跟踪锚点上
  • 实际显示的代码示例。 dae文件
+0

您可以使用增强现实模板创建新的iOS应用程序,并从内容技术弹出式菜单中选择SceneKit或SpriteKit。 –

回答

30

使用你的代码没什么好看 - 只是一个实时相机视图。

您在现实中没有看到任何增强的主要原因是,只有在将锚定添加到ARSession时,您的代码才会将SceneKit内容添加到场景中......但您并未手动添加任何锚定,而且您尚未启用平面检测,因此ARKit不会自动添加锚点。如果启用飞机检测,您将开始进入某处...

self.realityConfiguration = ARWorldTrackingSessionConfiguration() 
realityConfiguration?.planeDetection = .horizontal 

但是您仍然不会看到任何东西。这是因为您的ARSCNViewDelegate实现有冲突的说明。这部分:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { 
    return nil 
} 

...表示不会为您的锚点创建SceneKit节点。由于没有节点,因此您的renderer(_:didAdd:for:)函数永远不会被调用,所以您在该方法中的代码永远不会创建任何SceneKit内容。

如果打开平面检测和删除/注释掉renderer(_: nodeFor:)方法,你的代码的其余部分应该让你这样的事情:

(纯白色区域是您SCNPlane我。我必须在白色桌子上展开我的iPad封面,为飞机检测找到足够的场景细节找到任何东西,并检查背景......今天在WWDC上有一个时刻,那里的商店没有人满为患。)

至于你是否需要一个A9 ,苹果的消息在这里有点不清楚。当他们说ARKit需要A9或更好的时候,他们的真正含义是ARWorldTrackingSessionConfiguration。这就是所有最好的AR魔术所在。(甚至还有arkit一个UIRequiredDeviceCapabilities关键,实际上涵盖了与全球跟踪支持设备,这样就可以限制你在App Store上的应用程序到被只提供给那些设备。)

目前仍然一些 ARKit没有世界的跟踪,虽然。运行与基类ARSessionConfiguration的会话,您将获得仅定位跟踪。 (没有位置跟踪,没有飞机检测,没有命中测试。)

这是什么让你?那么,如果你玩过当前版本的PokémonGO,它就是这样工作的:因为它只跟踪设备的方向,而不是位置,你不能靠近皮卡丘或在他身后走动 - 他占据真实的幻觉只要你只是倾斜或转动你的设备而不移动它,世界就可以成立。

您可以使用SceneKit加载3D内容,并将其放置在AR中,就像加载并放置在任何其他SceneKit应用程序/游戏中一样。这里有很多资源,还有很多方法可以做到这一点。其中一个您可以在创建新AR项目并选择SceneKit时在Xcode模板中找到。装载部分是这样的:

let scene = SCNScene(named: "ship.scn" inDirectory: "assets.scnassets") 
let ship = scene.rootNode.childNode(withName: "ship", recursively: true) 

然后将其放置:

ship.simdPosition = float3(0, 0, -0.5) 
// half a meter in front of the *initial* camera position 
myARSCNView.scene.rootNode.addChildNode(ship) 

的主要区别要记住把事情AR是位置,以米为单位(和你的内容需要被设计成它的尺寸合理)。

+0

谢谢你rickster!希望你在WWDC有一个爆炸。我现在看到我的委托方法是冲突的。我以为'ARWorldTrackingSessionConfiguration.planeDetection'默认打开了,但我再次检查了文档,果然! –

+0

@JonVogel我认为它默认是关闭的,所以你必须明确地设置它才能使它工作,现在它也是'ARWorldTrackingConfiguration.PlaneDetection'。 – chengsam