2017-07-07 4 views
0

Ich versuche, eine primitive mit SceneKit und Arkit zu erstellen. Aus irgendeinem Grund funktioniert es nicht.Erstellen einer Box mit SceneKit und 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) 

Muss ich auch die Kamerakoordinaten einbeziehen?

Antwort

2

Sie sollten die Lage angezapft und verwenden, um die Welt erhalten koordiniert die Würfel richtig zu platzieren. Ich bin mir nicht sicher (0,0,0) ist ein normaler Ort für ARKit. Sie können so etwas wie dies versuchen:
Setzen Sie diese in Ihrem viewDidLoad:

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

Dann diese Methode hinzufügen:

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

Dann, wenn Sie auf einer ebenen Fläche erfasst tippen, wird es ein Feld auf hinzufügen das Flugzeug, auf das du geklopft hast.

+0

Ich habe einen Build-Fehler und änderte diesen Teil. Es hat nicht funktioniert, also habe ich es geändert. ‚node.position = SCNVector3Make ((HitResult? .worldTransform.columns.3.x) !, (HitResult? .worldTransform.columns.3.y) !, (HitResult? .worldTransform.columns.3.z)!) ' – ParalaxWobat

+0

Hat es dann funktioniert? – OxyFlax

+0

Es wurde kein Würfel hinzugefügt. Ich habe etwas Einfaches versucht, um der Szene in AR einfach einen Würfel hinzuzufügen. Ich bin mir nicht sicher, warum es nicht funktioniert. – ParalaxWobat

1

Ihr Code sieht gut aus und es sollte funktionieren. Ich habe es wie folgt ausprobiert: Nachdem ich eine neue App mit ARKit Template erstellt habe, habe ich die Funktion viewDidLoad ersetzt.

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

Erzeugt eine Box am ursprünglichen Punkt (0, 0, 0). Leider befindet sich Ihr Gerät in der Box, so dass Sie diese Box nicht direkt sehen können. Um die Box zu sehen, bewege dein Gerät ein wenig weiter.

Das beigefügte Bild ist die Box nach meinem Gerät bewegen:

enter image description here

Wenn Sie es sofort sehen möchten, das Feld nach vorne ein wenig zu bewegen, Farbe hinzufügen und das erste Material doppelseitig sein machen (um es zu sehen, auch in oder außerhalb der Seite):

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) 
Verwandte Themen