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

Ios 如何将相机外部矩阵转换为SCNCamera位置和旋转,ios,opengl-es,augmented-reality,scenekit,aruco,Ios,Opengl Es,Augmented Reality,Scenekit,Aruco,我正试图通过SceneKit实现增强现实 我使用ARuco(OpenCV增强现实库)估计了一个标记的姿势,得到了一个内在相机矩阵和一个外在矩阵 我用内在矩阵(fovy、aspect、zNear、zFar)的参数设置了SCNCamera的projectontransform 通常在OpenGL中,使用ModelView计算相对于相机坐标的世界坐标,但在SceneKit中,没有ModelView之类的东西 因此,我计算了外部矩阵的逆矩阵,以得到相对于世界坐标(标记坐标)的相机坐标 我想我已经通过包含

我正试图通过
SceneKit
实现增强现实

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

我用内在矩阵(fovy、aspect、zNear、zFar)的参数设置了
SCNCamera
projectontransform

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

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

我想我已经通过包含旋转和平移矩阵的逆矩阵得到了正确的摄像机位置

然而,我无法从中获得相机的旋转


你有什么想法吗?

SceneKit的视图矩阵与你在OpenGL中遇到的视图矩阵相同,它们只是有点隐藏,直到你开始玩弄着色器。我觉得有点太隐蔽了

你似乎已经解决了大部分问题。投影矩阵来自您的相机
projectionTransform
,视图矩阵来自相机矩阵的逆矩阵
scnmarix4invert(cameraNode.transform)
。在我的例子中,一切都在世界坐标系中,使我的模型矩阵成为一个简单的单位矩阵

我最后用来获取经典模型视图投影矩阵的代码类似于

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

let viewProjection = SCNMatrix4Mult(view, projection)
let modelViewProjection = SCNMatrix4Mult(model, viewProjection)
出于某种原因,我发现
SCNMatrix4Mult(…)
采用的参数顺序与我预期的不同(例如,
GLKMatrix4Multiply(…)


我仍然不是100%了解这一点,因此欢迎编辑/提示。使用此方法,我无法获得SceneKit MVP矩阵(传递给着色器)以与上面代码计算的矩阵匹配。。。但它离我所需要的足够近了。

@lock的答案看起来很好,添加了一些内容:

(1) 如果cameraNode已设置动画或为其父级,则访问SCNNode worldTransform而不是transform:

let view = SCNMatrix4Invert(cameraNode.presentationNode.worldTransform)
(2) 代码没有考虑视图的纵横比。e、 例如,假设使用透视投影,您将需要执行以下操作:

perspMatrix.m11 /= viewportAR; //if using Yfov -> adjust Y`
/* or, */
perspMatrix.m22 *= viewportAR; //if using Xfov -> adjust X`
其中,
viewportAR=viewport.width/viewport.height

另一种方法是在场景中使用一个具有渲染代理的节点,并从该代理检索SceneKit的矩阵(它们作为选项传递):


我还没有意识到我所需要的只是反转外部矩阵,并将其设置为
SCNCamera
s
变换
!你的回答给了我一个暗示。但我需要旋转外部矩阵,可能是因为OpenCV的坐标和OpenGL的坐标不同。不过,我的3D模型看起来与真实的标记并不完全匹配。也许是内在参数的问题…很高兴这有点帮助。以前从未看过AR的东西,希望其他人能帮你。@akira108你能展示一下设置相机和模型变换的相关代码吗?@Cameron Lowell Palmer我已经成功地使用Vuforia framework计算的内在和外在矩阵设置了变换和投影变换。我写了一篇关于这方面的文章,如果你感兴趣,请看:)@akira108我也算出来了。
FOUNDATION_EXTERN NSString * const SCNModelTransform;
FOUNDATION_EXTERN NSString * const SCNViewTransform;
FOUNDATION_EXTERN NSString * const SCNProjectionTransform;
FOUNDATION_EXTERN NSString * const SCNNormalTransform;
FOUNDATION_EXTERN NSString * const SCNModelViewTransform;
FOUNDATION_EXTERN NSString * const SCNModelViewProjectionTransform;