2017-07-07 14 views
0

SceneKitとARKitでプリミティブを作成しようとしています。どんな理由であれ、それは機能していません。SceneKitとARKitでボックスを作成する

let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0) 

    let node = SCNNode(geometry: box) 

    node.position = SCNVector3(0,0,0) 

    sceneView.scene.rootNode.addChildNode(node) 

カメラの座標も取り込む必要がありますか?

答えて

2

位置をタップし、ワールド座標を使用してキューブを適切に配置する必要があります。私は(0,0,0)がARKitの通常の場所であるかどうかはわかりません。あなたが検出された平面上でタップすると

@objc func handleTapFrom(recognizer: UITapGestureRecognizer) { 
    let tapPoint = recognizer.location(in: self.sceneView) 
    let result = self.sceneView.hitTest(tapPoint, types: ARHitTestResult.ResultType.existingPlaneUsingExtent) 

    if result.count == 0 { 
     return 
    } 

    let hitResult = result.first 

    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0) 

    let node = SCNNode(geometry: box) 
    node.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.static, shape: nil) 
    node.position = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z) 

    sceneView.scene.rootNode.addChildNode(node) 
} 

その後、それは上のボックスを追加します。このメソッドを追加し

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapFrom)) 
tapGestureRecognizer.numberOfTapsRequired = 1 
self.sceneView.addGestureRecognizer(tapGestureRecognizer) 


あなたのviewDidLoadでこれを入れて:あなたはこのような何かを試すことができますあなたがタップした飛行機。

+0

私はビルドエラーを取得し、この部分を変更しました。それは動作しませんでしたので、私はこれに変更しました。 'node.position = SCNVector3Make((hitResult?.worldTransform.columns.3.x)!,(hitResult?.worldTransform.columns.3.y)!、(hitResult?.worldTransform.columns.3.z)! ) ' – ParalaxWobat

+0

これでうまくいきましたか? – OxyFlax

+0

キューブを追加しませんでした。 ARのシーンにキューブを追加するだけの簡単なことを試していました。なぜそれが動作しないのか分かりません。 – ParalaxWobat

1

コードはうまく見え、うまくいくはずです。私は以下のコードで試してみました:ARKitテンプレートを使って新しいアプリケーションを作成した後、関数viewDidLoadを置き換えました。

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Set the view's delegate 
    sceneView.delegate = self 

    let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0) 
    let node = SCNNode(geometry: box) 
    node.position = SCNVector3(0,0,0) 
    sceneView.scene.rootNode.addChildNode(node) 
} 

元の点(0、0、0)にボックスを作成します。残念ながら、あなたのデバイスは箱の中に入っているので、あなたはその箱をまっすぐに見ることができません。ボックスを表示するには、デバイスを遠くに移動します。

添付された画像は、私のデバイスを移動した後のボックスです:

enter image description here

あなたは、すぐにそれを見る前に少しボックスを移動、色を追加し、第1の材料が両面なるようにしたい場合(それを見たり外に見るために:

let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0) 
    box.firstMaterial?.diffuse.contents = UIColor.red 
    box.firstMaterial?.isDoubleSided = true 
    let boxNode = SCNNode(geometry: box) 
    boxNode.position = SCNVector3(0, 0, -1) 
    sceneView.scene.rootNode.addChildNode(boxNode) 
関連する問題