4

我正在尝试使用 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)

我还需要获取相机坐标吗?

4

2 回答 2

5

您的代码看起来不错,应该可以工作。我已经尝试过如下代码:使用 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) 创建一个框。不幸的是,您的设备在盒子内,因此您无法直接看到该盒子。要查看该框,请将您的设备移远一点。

附图是移动我的设备后的盒子:

在此处输入图像描述

如果您想立即看到它,请将框移到前面一点,添加颜色并使第一种材料是双面的(甚至可以看到它的内侧或外侧):

    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)
于 2017-08-03T06:33:58.993 回答
2

您应该点击位置并使用世界坐标正确放置立方体。我不确定 (0,0,0) 是 ARKit 的正常位置。你可以尝试这样的事情:
把它放在你的viewDidLoad中:

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

然后添加这个方法:

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

然后,当您点击检测到的平面表面时,它会在您点击的平面上添加一个框。

于 2017-07-07T15:40:47.897 回答