2017-06-13 87 views
4

我有移動的物體,我想能夠與我碰撞玩家。我有能力通過在當時獲得我當前的位置/方向從我發射物體,但我不知道如何將一個物體附加到我身上,隨時都會遵循我的定位。如何用ARKit Swift將對象附加到相機位置?

+2

您在ARKit中使用哪種顯示技術? SceneKit? SpriteKit?統一?等... – rickster

+1

我使用SceneKit作爲我的顯示技術。 – JoshKopen

回答

15

在SceneKit中,場景中所有可能具有位置的東西都是(附加到)一個節點。這不僅包括可見物體,還包括光源和照相機。當您使用ARSCNView時,仍然有一個SceneKit相機,但ARKit控制其位置/方向。

SceneKit節點創建一個層次結構:每個節點的位置(和方向等)都是相對於其父節點。如果父節點在場景內移動,它的子節點將與它一起移動,以便它們保持相同的父親相對位置。因此,如果您希望始終保持相對於相機的相同位置,則應該將該內容設爲相機節點的子節點。

即使在您自己不創建相機的場景中(例如,當SceneKit和ARKit爲您管理相機時),您也可以通過視圖的pointOfView屬性獲取包含當前相機的節點。 (注:ARSCNViewSCNView一個子類,其大部分有用的API由SCNSceneRenderer協議定義的。)

您可能必須等到會議開始運行訪問ARKit管理相機節點。

6

ARSCNView有一個屬性'pointOfView'。您可以附加一個子節點。

let ball = SCNSphere(radius: 0.02) 
ballNode = SCNNode(geometry: ball) 
ballNode?.position = SCNVector3Make(0, 0, -0.2) 
sceneView.pointOfView?.addChildNode(ballNode!) 

節點將跟隨你的相機,你去任何地方。

+0

如果您想將對象添加到相機的節點層次結構中,但是如果想將其添加到標準sceneView的節點層次結構中,那麼這非常有用,那麼我推薦這種方法使SCNNode始終位於相機的前面:https:/ /stackoverflow.com/questions/42029347/position-a-scenekit-object-in-front-of-scncameras-current-orientation/42030679#42030679 – edenwaith

0

以下代碼爲我獲取相機的當前位置(x,y,z座標)。

let pov = sceneView.pointOfView 
    let position = pov?.position 

    let x = position?.x 
    let y = position?.y 
    let z = position?.z