使用Vuforia在SceneKit中提供了Projection Matrix和Marker Pose

时间:2016-05-25 10:47:27

标签: scenekit vuforia

目前我正试图在SceneKit中渲染时对投影矩阵和framemarker姿势的使用进行故障排除。场景中的模型和摄像机图像背景显示没有问题。但是,一旦我更改投影矩阵和framemarker姿势矩阵以匹配Vuforia,一切都会被推离屏幕。

func didUpdateProjectionMatrix(projectionMatrix: matrix_float4x4)
{
    let extrinsic = SCNMatrix4FromMat4(projectionMatrix)
    let camera = self.cameraNode?.camera
    camera?.setProjectionTransform(extrinsic)
}

func didUpdateFramemarkers(framemarkers: [Framemarker]?)
{
    guard let framemarkers = framemarkers else {
        return
    }

    for framemarker in framemarkers {
        let pose = SCNMatrix4Invert(SCNMatrix4FromMat4(framemarker.pose))
        self.objectNode?.transform = pose
    }
}

这是设置SCNCamera和对象节点的正确方法吗?还有什么需要设置Vuforia帧标记来使用SceneKit吗?

1 个答案:

答案 0 :(得分:2)

它只是有效!

困难的部分是确定使这项工作需要哪些SceneKit。最初我读了文章Making Augmented Reality app easily with Scenekit + Vuforia,其中概述了如何为用户定义的目标重新调整示例应用程序。该文章的缺点包括它并不总是清楚作者改变了什么,没有提供样本项目,而是基于旧版本的Vuforia。最终,我发现无需反转姿势矩阵。

绘制相机图像并设置投影矩阵并更新标记姿势

override func viewDidLoad() 
{
    super.viewDidLoad()

    let scene = SmartScanScene()

    let camera = SCNCamera()
    let cameraNode = SCNNode()
    cameraNode.camera = camera
    scene.rootNode.addChildNode(cameraNode)
    _cameraNode = cameraNode

    let view = self.view as! SCNView
    view.backgroundColor = UIColor.blackColor()
    view.showsStatistics = true
    // view.debugOptions = SCNDebugOptions.ShowBoundingBoxes.union(.ShowWireframe)
    view.autoenablesDefaultLighting = true
    view.allowsCameraControl = false
}

func didUpdateProjectionMatrix(projectionMatrix: matrix_float4x4)
{
    let extrinsic = SCNMatrix4FromMat4(projectionMatrix)
    _cameraNode?.camera?.setProjectionTransform(extrinsic)
}

func didUpdateFramemarkers(framemarkers: [Framemarker]?)
{
    guard let framemarkers = framemarkers else {
        return
    }

    for framemarker in framemarkers {
        let pose = SCNMatrix4FromMat4(framemarker.pose)
        self.objectNode?.transform = pose
    }
}

func didUpdateCameraImage(image: UIImage?)
{
    if let image = image {
        _scene?.background.contents = image
    }
}