ARKIT: размещение объекта на плоскости не работает должным образом

Я изучаю ARKit и пытаюсь разместить объект на обнаруженной плоскости. Но это не работает должным образом, и между плоскостью и 3D-объектом есть пространство.

вот мой код для обнаружения самолета:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        position = SCNVector3Make(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)

        guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

        let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z))

        planeNode = SCNNode(geometry: plane)
        planeNode.position = position
        planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2.0, 1.0, 0.0, 0.0)
        node.addChildNode(planeNode)
}

И тогда 3d модель получает ту же позицию:

object.position = position

Но когда я запускаю приложение, между объектом и плоскостью остается большое пространство. Я не понял, почему?


person Sam    schedule 07.08.2017    source источник


Ответы (1)


Из-за привязки преобразование связано с мировыми координатами. Узел в func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) уже расположен в мировых координатах. Итак, все, что вам нужно, — это просто добавить свой собственный узел в качестве дочернего узла для отображаемого узла:

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let planeAnchor = anchor as? ARPlaneAnchor else { return }

        let plane = SCNPlane(width: CGFloat(planeAnchor.extent.x), height: CGFloat(planeAnchor.extent.z))

        planeNode = SCNNode(geometry: plane)
        planeNode.position = SCNVector3Zero // Position of `planeNode`, related to `node`
        planeNode.transform = SCNMatrix4MakeRotation(-Float.pi / 2.0, 1.0, 0.0, 0.0)
        node.addChildNode(planeNode)
    }
person Vasilii Muravev    schedule 08.08.2017
comment
Используйте геометрию SCNSphere с радиусом 10 см и красным цветом для первого материала для размещения тестовых узлов, вам будет легче правильно разместить его. Затем, после его отладки, вы можете использовать любые другие объекты, которые вам нужны. - person Vasilii Muravev; 10.08.2017
comment
+ за указание, что я должен добавить свой объект в отображаемый узел - person Mohamed Salah; 16.05.2020