SceneKit的SCNMatrix4是按列主序还是行主序存储的?

3
我困惑的来源是苹果公司有关SCNMatrix4 的文档:
场景工具包(SceneKit)使用矩阵来表示坐标空间变换,这些变换可以表示对象在三维空间中的组合位置、旋转或方向和比例。SceneKit 矩阵结构以行主序排列,因此它们适用于传递给着色器程序或OpenGL API接受矩阵参数的情况。
这看起来是自相矛盾的,因为OpenGL使用列优先变换矩阵!
总体而言,苹果公司在这个主题上的文档非常差:
  • GLKMatrix4 根本没有讨论列和行的优先级,但我确定从所有在线讨论中得知,GLKMatrix是明显且简单地采用列优先规则。
  • simd_float4x4未涉及这个主题,但至少变量名清楚地表明它按列存储:
simd/float.h:
typedef struct { simd_float4 columns[4]; } simd_float4x4;

在线讨论中,有些人认为SCNMatrix4与GLKMatrix4不同,但是查看SCNMatrix4的代码可以发现,它可能只是按列顺序排列,这是我们所期望的:

/* Returns a transform that translates by '(tx, ty, tz)':
 * m' =  [1 0 0 0; 0 1 0 0; 0 0 1 0; tx ty tz 1]. */
NS_INLINE SCNMatrix4 SCNMatrix4MakeTranslation(float tx, float ty, float tz) {
    SCNMatrix4 m = SCNMatrix4Identity;
    m.m41 = tx;
    m.m42 = ty;
    m.m43 = tz;
    return m;
}

SCNMatrix4是行主序(将平移存储在m14m24m34)还是列主序(将平移存储在m41m42m43)?


同样非常重要的是,这也会导致显着的混淆:https://stackoverflow.com/questions/53435756/xcode-simd-issue-with-translation-and-rotation-matrix-example - oneiros
1个回答

3

SCNMatrix4 存储了平移信息在 m41m42m43 中,与 GLKMatrix4 相同。这个小 Playground 确认了它以及它的定义。

import SceneKit

let translation = SCNMatrix4MakeTranslation(1, 2, 3)

translation.m41
// 1
translation.m42
// 2
translation.m43
// 3

我不知道为什么文档中这个有误,可能只是一个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接