如何将相机外部矩阵转换为SCNCamera位置和旋转

aki*_*108 3 opengl-es augmented-reality ios scenekit aruco

我正在努力实现增强现实SceneKit.

通过使用ARuco(OpenCV增强现实库)估计标记的姿势,我得到了内在的相机矩阵和外在矩阵.

我用内在矩阵(fovy,aspect,zNear,zFar)的参数设置了SCNCamera's' projectionTransform.

通常在OpenGL,相对于相机坐标的世界坐标是使用ModelView计算的,但在SceneKit中,没有诸如modelView之类的东西.

因此,我计算了外部矩阵的逆矩阵,以获得相对于世界坐标(标记坐标)的相机坐标.

而且我认为我通过包含旋转和平移矩阵的逆矩阵得到了正确的摄像机位置.

但是我不能从那里获得相机的旋转.

你有什么想法?

loc*_*ock 6

SceneKit具有与您在OpenGL中遇到的相同的视图矩阵,在您开始使用着色器之前,它们只是隐藏一些.有点太隐蔽的IMO.

你似乎已经弄明白了.投影矩阵来自您的相机projectionTransform,视图矩阵来自相机矩阵的反转SCNMatrix4Invert(cameraNode.transform).在我的例子中,一切都在世界坐标中,使我的模型矩阵成为一个简单的单位矩

我最终使用的代码来获得经典的模型 - 视图 - 投影矩阵就像......

let projection = camera.projectionTransform()
let view = SCNMatrix4Invert(cameraNode.transform)
let model = SCNMatrix4Identity

let viewProjection = SCNMatrix4Mult(view, projection)
let modelViewProjection = SCNMatrix4Mult(model, viewProjection)
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我发现SCNMatrix4Mult(...)参数的顺序与我预期的顺序不同(例如;相反GLKMatrix4Multiply(...)).

我仍然不是100%,所以欢迎编辑/提示.使用这种方法我无法获得SceneKit MVP矩阵(传递给着色器)以匹配上面代码计算的...但它足够接近我需要的东西.