ARKit: размещение 3D-объекта поверх изображения


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

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    guard let imageAnchor = anchor as? ARImageAnchor else { return }

    let referenceImage = imageAnchor.referenceImage

    updateQueue.async {  
        // Add a virtual cup at the position of the found image
        self.virtualObject.addVirtualObjectWith(sceneName: "cup.dae",
                                                childNodeName: nil,
                                                position: SCNVector3(x: imageAnchor.transform.columns.3.x,
                                                                     y: imageAnchor.transform.columns.3.y,
                                                                     z: imageAnchor.transform.columns.3.z),
                                                recursively: true,
                                                imageAnchor: imageAnchor)

    }

}

Чашка когда только что добавилась к сцене

Проблема в том, что когда я перемещаю ориентацию устройства, чашка не будет хорошо держаться в середине изображения. Я также хотел бы иметь чашку на том же месте, даже когда я удаляю изображение. Я не понимаю проблемы, потому что когда вы добавляете объект, используя обнаружение плоскости и попадание для испытания самолета используется также Аранчор.

Чашка при перемещении устройства

Обновление 14.05.2018

 func addVirtualObjectWith(sceneName: String, childNodeName: String, objectName: String, position: SCNVector3, recursively: Bool, node: SCNNode?){
    print("VirtualObject: Added virtual object with scene name: (sceneName)")

    let scene = SCNScene(named: "art.scnassets/(sceneName)")!
    var sceneNode = scene.rootNode.childNode(withName: childNodeName, recursively: recursively)!
    sceneNode.name = objectName
    sceneNode.position = position

    add(object: sceneNode, toNode: node)

}

func add(object: SCNNode, toNode: SCNNode?){
    if toNode != nil {
        toNode?.addChildNode(object)
    }
    else {
        sceneView.scene.rootNode.addChildNode(object)
    }
}
1 5

1 ответ:

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

инспектор атрибутов