2017-07-07 3 views
0

J'essaye de créer une primitive avec SceneKit et ARKit. Pour une raison quelconque, cela ne fonctionne pas.Création d'une boîte avec SceneKit et 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) 

Est-ce que je dois également prendre les coordonnées de la caméra?

Répondre

2

Vous devriez obtenir l'emplacement tapé et utiliser les coordonnées du monde pour placer le cube correctement. Je ne suis pas sûr (0,0,0) est un emplacement normal pour ARKit. Vous pouvez essayer quelque chose comme ceci:
Mettez dans votre viewDidLoad:

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

ajouter cette méthode:

@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) 
} 

Ensuite, lorsque vous appuyez sur une surface plane détectée, il va ajouter une boîte sur l'avion où vous avez tapoté.

+0

J'ai eu une erreur de construction et j'ai modifié cette partie. Cela n'a pas fonctionné, alors j'ai changé cela. 'node.position = SCNVector3Make ((hitResult? .worldTransform.columns.3.x) !, (hitResult? .worldTransform.columns.3.y) !, (hitResult? .worldTransform.columns.3.z)! ' – ParalaxWobat

+0

A-t-il fonctionné alors? – OxyFlax

+0

Il n'a pas ajouté de cube. J'essayais quelque chose de simple pour ajouter un cube à la scène en AR. Je ne sais pas pourquoi ça ne marche pas. – ParalaxWobat

1

Votre code semble bon et cela devrait fonctionner. Je l'ai essayé comme le code ci-dessous: après avoir créé une nouvelle application avec le modèle ARKit, j'ai remplacé la fonction 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) 
} 

Il crée une boîte au point d'origine (0, 0, 0). Malheureusement, votre appareil est à l'intérieur de la boîte, donc vous ne pouvez pas voir cette boîte directement. Pour voir la boîte, déplacez votre appareil loin un peu.

L'image ci-joint est la boîte après le déplacement de mon appareil:

enter image description here

Si vous voulez le voir immédiatement, déplacer la zone à l'avant un peu, ajouter de la couleur et faire le premier matériau soit double face (pour le voir même dans ou hors du côté):

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)