SCNMatrix4 vs simd-列专业还是行专业?

时间:2018-11-25 19:31:09

标签: xcode scenekit arkit

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中,然后将它们实际存储在第四行中。

我找不到明确的信息来说明正在使用的确切约定。 m41是指第四列第一行还是第四行第一列?

1 个答案:

答案 0 :(得分:0)

转换矩阵会告诉您它是行还是列。翻译发生在每一行的末尾。由于翻译在打印时显示在底部的“行”中,因此每一行代表一列。

TL; DR。它使用列主要存储。