我混淆的原因是来自Apple的SCNMatrix4 文档:
SceneKit使用矩阵表示坐标空间变换, 而这又可以代表组合位置,旋转或 三维空间中物体的方向和比例。 SceneKit矩阵结构是行主要顺序,所以它们是 适合传递到接受矩阵参数的着色器程序或OpenGL API 。
这似乎是矛盾的,因为OpenGL使用了列主变换矩阵!
一般来说,关于这个主题的Apple文档很差:
来自simd/float.h
:
typedef struct { simd_float4 columns[4]; } simd_float4x4;
在线讨论关于SCNMatrix4的讨论,好像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
中的翻译,{{}} { {1}},m42
)?
答案 0 :(得分:2)
SCNMatrix4
将翻译存储在m41
,m42
和m43
中,GLKMatrix4
也是如此。这个小游乐场确认了它以及它的定义。
import SceneKit
let translation = SCNMatrix4MakeTranslation(1, 2, 3)
translation.m41
// 1
translation.m42
// 2
translation.m43
// 3
我不知道为什么在文档中这是错误的,可能只是一个错误。