2017-06-07 108 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