2017-09-24 15 views
2

以下のコードは、タッチしたポイントにSCNPlaneを配置しますが、アプリケーション開始時の位置にプレーンを配置(回転)します。私は理想的には、ノードを物理的な壁面またはカメラの現在の向きに向けるのが理想的です。これはARKitでどのように行われますか?ARKitでカメラへのSCNNodeの向きを変更する方法

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    guard let touch = touches.first else {return} 
    let result = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint]) 
    guard let hitResult = result.last else {return} 
    let hitTransform = SCNMatrix4.init(hitResult.worldTransform) 

    let hitVector = SCNVector3Make(hitTransform.m41, hitTransform.m42, hitTransform.m43) 
    createPlane(position: hitVector) 
} 

func createPlane(position: SCNVector3) { 

    let background = SCNNode() 
    background.geometry = SCNPlane.init(width: 0.12, height: 0.10) // better set its size 
    background.geometry?.firstMaterial?.diffuse.contents = "odinBW2.jpeg" 
    background.position = position 

    sceneView.scene.rootNode.addChildNode(background) 

} 
+0

あなたはそれに対して解決策を見つけましたか? –

+0

最後に、arkitの表示を開始する前に、適切な方向に電話機を向けるように指示するように指示しました。 –

答えて

2

1 - これは、あなたが最初のカメラの回転を取得する方法である:

ピッチ - X軸

let pitch = sceneView.session.currentFrame?.camera.eulerAngles.x 

あくびを中心とした回転 - 周りの回転Y軸

let yawn = sceneView.session.currentFrame?.camera.eulerAngles.y 

ロール -

let roll = sceneView.session.currentFrame?.camera.eulerAngles.z 

2軸Zを中心とする回転 - そして、あなたはどんな回転をしたくない場合は、(0を維持したい回転に一致するSCNVector3を作成することができます

let newRotation = SCNVector3Make(pitch, yawn, roll) 

3 - そして、あなたはあなたのノードにこのオイラー角の属性::)軸上の

whateverNode.eulerAngles = newRotation 
0

ノードをカメラの向きに揃えたい場合は、SCNBillboardConstraintを使用します。

let yourNode = SCNNode() 

let billboardConstraint = SCNBillboardConstraint() 
billboardConstraint.freeAxes = [.X, .Y, .Z] 
yourNode.constraints = [billboardConstraint] 
関連する問題