SceneKit的SCNMatrix4是存储为列还是行主要?

时间:2017-07-04 05:29:32

标签: ios swift macos opengl-es scenekit

我混淆的原因是来自Apple的SCNMatrix4 文档:

  

SceneKit使用矩阵表示坐标空间变换,   而这又可以代表组合位置,旋转或   三维空间中物体的方向和比例。   SceneKit矩阵结构是行主要顺序,所以它们是   适合传递到接受矩阵参数的着色器程序或OpenGL API

这似乎是矛盾的,因为OpenGL使用了列主变换矩阵!

一般来说,关于这个主题的Apple文档很差:

  • GLKMatrix4根本没有讨论专栏与行专业,但是 我在网上的所有讨论中都确定GLKMatrix很简单 简单的专栏。
  • simd_float4x4不谈论 主题,但至少变量名称清楚地表明它是 存储为列:

来自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行主要(存储m14m24m34中的翻译)或列主要(存储m41中的翻译,{{}} { {1}},m42)?

1 个答案:

答案 0 :(得分:2)

SCNMatrix4将翻译存储在m41m42m43中,GLKMatrix4也是如此。这个小游乐场确认了它以及它的定义。

import SceneKit

let translation = SCNMatrix4MakeTranslation(1, 2, 3)

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

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