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

VS旗舰版和专业版的区别(旗舰版和专业版的区别)

借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率

如何在新的 .NET Framework 4.6 中启用 SIMD?

SIMT 和 SIMD 中的控制流发散

vs studio2022家庭版可以装吗