2017-08-03 33 views
1

我上了XCode 9的AR應用程序啓動器,其中錨在一個場景中創建水龍頭上打轉轉:ARKit設置ARAnchor變換基於觸摸位置

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    guard let sceneView = self.view as? ARSKView else { 
    return 
    } 

    // Create anchor using the camera’s current position 
    if let currentFrame = sceneView.session.currentFrame { 

    // Create a transform with a translation of 0.2 meters in front  
    // of the camera 
    var translation = matrix_identity_float4x4 
    translation.columns.3.z = -0.2 
    let transform = simd_mul(currentFrame.camera.transform, translation) 

    // Add a new anchor to the session 
    let anchor = ARAnchor(transform: transform) 
    sceneView.session.add(anchor: anchor) 
    } 
} 

這總是導致錨在創建屏幕中間,無論我在哪裏點擊,這是有道理的,因爲我們正在獲取當前的相機變換,並只在z軸上應用平移。

我想把錨放在我實際用手指敲擊的地方。我可以使用touches.first?.location(in: sceneView)獲取水龍頭的位置,即,屏幕左上角的點距離,但我不確定如何將這些2D pt座標應用於以米爲單位的錨點變換,也不知道它們是哪個軸適用於。

回答

4

我假設你指的是蘋果的ARKitExample項目「將虛擬對象放在增強現實中」。

查看當您在屏幕上移動(已放置)模型時調用的方法VirtualObject.translateBasedOnScreenPos(_:instantly:infinitePlane:) - 基本上需要解決您描述的相同問題。

你會發現這又會調用ViewController.worldPositionFromScreenPosition(_:objectPos:infinitePlane:)

從該方法提取,他們的做法是:

  1. 永遠做一個擊中測試第一exisiting平面錨。 (如果任何此類錨點僅在其範圍內存在&)。

  2. 通過針對特徵點雲進行命中測試來收集有關環境的更多信息,但不返回結果。

  3. 如果需要或必要(沒有好的功能命中測試結果):對無限水平面(忽略真實世界)進行命中測試。

  4. 如果可用,如果對無限飛機的命中測試跳過了 或者沒有命中無限飛機,則返回高質量特徵的命中測試結果。

  5. 作爲最後的手段,對特徵執行第二次未過濾命中測試。如果場景中沒有任何功能,則返回的結果 將爲零。

正如你所看到的,他們認爲可能有或可能,並不適用於你的用例的各個方面。考慮研究並重新使用(部分)他們的方法。

+0

謝謝!我實際上是指在開始一個新的增強現實應用程序時得到的XCode中的框架項目,但我會看看演示應用程序。 – Elise

+0

不客氣。它在這裏:https://developer.apple.com/sample-code/wwdc/2017/PlacingObjects.zip NB。從應用程序菜單中打開「調試可視化」將澄清很多。 – PDK