SCNMatrix4 vs simd - 列专业还是行专业?
Posted
技术标签:
【中文标题】SCNMatrix4 vs simd - 列专业还是行专业?【英文标题】:SCNMatrix4 vs simd - Column Major or Row Major? 【发布时间】:2018-11-25 19:31:09 【问题描述】:SCNMatrix4
遵循列优先还是行优先约定?考虑以下几点:
func makeTranslationMatrix(tx: Float, ty: Float, tz: Float) -> simd_float4x4
var matrix = matrix_identity_float4x4
matrix[3, 0] = tx
matrix[3, 1] = ty
matrix[3, 2] = tz
return matrix
var T1 = makeTranslationMatrix(tx: 1, ty: 2, tz: 3)
print(T1.columns.0)
print(T1.columns.1)
print(T1.columns.2)
print(T1.columns.3)
/*
T1
float4(1.0, 0.0, 0.0, 0.0)
float4(0.0, 1.0, 0.0, 0.0)
float4(0.0, 0.0, 1.0, 0.0)
float4(1.0, 2.0, 3.0, 1.0)
*/
var sceneT1 = SCNMatrix4MakeTranslation(1, 2, 3)
print("\(sceneT1.m11), \(sceneT1.m12), \(sceneT1.m13), \(sceneT1.m14)")
print("\(sceneT1.m21), \(sceneT1.m22), \(sceneT1.m23), \(sceneT1.m24)")
print("\(sceneT1.m31), \(sceneT1.m32), \(sceneT1.m33), \(sceneT1.m34)")
print("\(sceneT1.m41), \(sceneT1.m42), \(sceneT1.m43), \(sceneT1.m44)")
/*
sceneT1
1.0, 0.0, 0.0, 0.0
0.0, 1.0, 0.0, 0.0
0.0, 0.0, 1.0, 0.0
1.0, 2.0, 3.0, 1.0
*/
如您所见,SCNMatrix4 的翻译值存储在第 4 列的 m41、m42、m43 中。由于矩阵被转置,这些值可能存储在 m41、m42、m43 中,然后它们实际上将平移值存储在第 4 行中。
我找不到明确的信息来说明所使用的确切约定。 m41
是指第四列第一行还是第四行第一列?
【问题讨论】:
【参考方案1】:翻译矩阵告诉你它是行主要还是列主要。翻译发生在每一行的末尾。由于打印出来时翻译出现在底部的“行”,所以每一行代表一列。
TL;博士。它使用 Column Major 存储。
【讨论】:
以上是关于SCNMatrix4 vs simd - 列专业还是行专业?的主要内容,如果未能解决你的问题,请参考以下文章
M1 上的 SceneKit SCNMatrix4Mult EXC_BAD_ACCESS
借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率