我困惑的来源是苹果公司有关SCNMatrix4 的文档:
场景工具包(SceneKit)使用矩阵来表示坐标空间变换,这些变换可以表示对象在三维空间中的组合位置、旋转或方向和比例。SceneKit 矩阵结构以行主序排列,因此它们适用于传递给着色器程序或OpenGL API接受矩阵参数的情况。
这看起来是自相矛盾的,因为OpenGL使用列优先变换矩阵!
总体而言,苹果公司在这个主题上的文档非常差:
场景工具包(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
是行主序(将平移存储在m14
,m24
,m34
)还是列主序(将平移存储在m41
,m42
,m43
)?