Почему Node добавляется ниже обнаруженной плоскости в ARKit

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

введите описание изображения здесь

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

}

person john doe    schedule 18.01.2019    source источник


Ответы (1)


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

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

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