2017-07-04 78 views
1

我的混亂的來源是來自蘋果上SCNMatrix4的文檔:這反過來又可以表示合併的位置,旋轉或 取向,和對象的規模SceneKit的SCNMatrix4是以列還是行爲主存儲的?

SceneKit使用矩陣來表示座標空間變換, 在三維空間。 SceneKit矩陣結構在行主要訂單,所以它們是 適合傳遞給接受矩陣參數的着色器程序或OpenGL API

這似乎是自相矛盾的,因爲OpenGL使用列主變換矩陣!

在蘋果對這個話題一般的文檔質量較差:

  • GLKMatrix4不談論與行主要列在所有,但 我相信所有的討論網上說GLKMatrix是平原和 簡單的專欄。
  • simd_float4x4不談論 話題,但至少變量名稱清楚表明它 存儲爲列:網上有關SCNMatrix4

    typedef struct { simd_float4 columns[4]; } simd_float4x4; 
    

    一些討論:

simd/float.h好像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行優先或列爲主(存儲m41m42m43譯)(在m14m24m34存儲翻譯)?

回答

1

SCNMatrix4將翻譯存儲在m41,m42m43,如GLKMatrix4所示。這個小遊樂場確認了它的定義。

import SceneKit 

let translation = SCNMatrix4MakeTranslation(1, 2, 3) 

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

我不知道爲什麼在文檔中這是錯誤的,但可能只是一個錯誤。

相關問題