如何将CMRotationMatrix转换为float4x4?

时间:2018-11-24 18:23:20

标签: ios swift metal core-motion

我正在构建一个Metal应用,该应用使用float4x4矩阵旋转3D对象和/或世界视图。

应用程序还在读取设备attitude,该设备可以表示为CMRotationMatrix格式(CoreMotion)的旋转矩阵。

如何将我的attitude.rotationMatrix投射到float4x4对象中?

1 个答案:

答案 0 :(得分:1)

您可以创建扩展名,该扩展名允许您根据float4x4的元素来初始化CMRotationMatrix

extension float4x4 {
    init(_ m: CMRotationMatrix) {
        let x = float4(Float(m.m11), Float(m.m21), Float(m.m31), 0)
        let y = float4(Float(m.m12), Float(m.m22), Float(m.m32), 0)
        let z = float4(Float(m.m13), Float(m.m23), Float(m.m33), 0)
        let w = float4(           0,            0,            0, 1)
        self.init(columns: (x, y, z, w))
    }
}

使用它就像调用初始化程序一样简单:

let simdMatrix = float4x4(deviceMotion.attitude.rotationMatrix)

这将创建一个矩阵,该矩阵适合于转换相对于reference attitude frame 表示转换的对象。您可能会发现需要对列进行置换,以使其与应用程序的世界坐标系匹配。