Почему узел добавляется ниже обнаруженной плоскости в ARKit - PullRequest
0 голосов
/ 18 января 2019

Я работаю над приложением ARKit, где я обнаруживаю плоскость, и теперь я хочу поместить объект поверх плоскости. Объект действительно добавляется на плоскости, но он немного под плоскостью. Я могу добавить высоту / 2 окна, и это решит проблему, но мне интересно, есть ли более простой способ.

enter image description here

private func addBox(at position: SCNVector3) {

    let box = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)
    let material = SCNMaterial()
    material.diffuse.contents = UIColor.red

    let boxNode = SCNNode(geometry: box)
    boxNode.position = position
    self.sceneView.scene.rootNode.addChildNode(boxNode)
}

@objc func tapped(recognizer :UITapGestureRecognizer) {

    let touch = recognizer.location(in: self.sceneView)

    if let nodeHitTest = self.sceneView.hitTest(touch, options: nil).first, nodeHitTest.node.name != "plane" {
        print("node")

        print(nodeHitTest.node)

    } else if let planeHitTest = self.sceneView.hitTest(touch, types: .estimatedHorizontalPlane).first {

        let position = SCNVector3(planeHitTest.worldTransform.columns.3.x, planeHitTest.worldTransform.columns.3.y, planeHitTest.worldTransform.columns.3.z)

        addBox(at: position)

        print("plane found")
    }

}

1 Ответ

0 голосов
/ 18 января 2019

Когда вы устанавливаете положение SCNNode, вы определяете положение центра точки узла, и именно поэтому ваш узел находится вертикально в середине плоскости.

Добавление половины высоты узла к оси Y, вероятно, является очень простым способом размещения узла на плоскости, как вы уже упоминали:

let position = SCNVector3(planeHitTest.worldTransform.columns.3.x,
                          planeHitTest.worldTransform.columns.3.y + Float(box.height/2), 
                          planeHitTest.worldTransform.columns.3.z)
...