目前我正试图在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吗?
答案 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
}
}