web-dev-qa-db-ja.com

ARKit Swiftを使用して、カメラの位置にオブジェクトをどのようにアタッチしますか?

プレイヤーと衝突させたい移動オブジェクトがあります。その時点での現在の位置/方向を取得することで、自分からオブジェクトを起動することができますが、常に自分の位置を追跡するオブジェクトを自分にアタッチする方法がわかりません。

8
JoshKopen

SceneKitでは、シーン内の位置を持つことができるすべてがノードに(アタッチされて)います。これには、目に見えるオブジェクトだけでなく、光源やカメラも含まれます。 ARSCNViewを使用しても、SceneKitカメラは存在しますが、ARKitがその位置/方向を制御します。

SceneKitノードは階層を作成します。すべてのノードの位置(および方向など)は、その親ノードを基準にしています。親ノードがシーン内で移動すると、その子も一緒に移動して、同じ親相対位置を維持します。したがって、カメラに対して常に同じ位置を維持したい場合は、そのコンテンツをカメラノードの子にする必要があります。

SceneKitやARKitがカメラを管理している場合など、カメラを自分で作成しないシーンでも、ビューの pointOfView を使用して現在のカメラを含むノードを取得できます。プロパティ。 (注:ARSCNViewSCNViewのサブクラスであり、そのほとんどの有用なAPIは SCNSceneRenderer プロトコルによって定義されています。)

ARKitが管理するカメラノードにアクセスするには、セッションが実行を開始するまで待機する必要がある場合があります。

21
rickster

ARSCNViewには 'pointOfView'プロパティがあります。子ノードを接続できます。

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

ノードはどこへ行ってもカメラを追跡します。

10
Jimi

次のコードは、カメラの現在の位置(x、y、z座標)を取得するために機能します。

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

    let x = position?.x
    let y = position?.y
    let z = position?.z
1
Ummar Ahmed

あなたはジミの答えを受け取り、それを見るためにボールに色や質感を与える必要があります:

let ball = SCNSphere(radius: 0.02)
ball.firstMaterial?.diffuse.contents = UIColor.red
let ballNode = SCNNode(geometry: ball)
ballNode.position = SCNVector3Make(0, 0, -0.2)
self.sceneView.pointOfView?.addChildNode(ballNode)
0
jeffslofish