首页 > 解决方案 > 如何将 CMRotationMatrix 转换为 float4x4?

问题描述

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

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

我怎样才能把我的attitude.rotationMatrix东西变成一个float4x4物体?

标签: iosswiftmetalcore-motion

解决方案


您可以创建一个扩展,允许您float4x4从 a 的元素初始化 a 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)

这将创建一个矩阵,该矩阵适用于变换其变换相对于参考姿态框架表示的对象。您可能会发现需要对列进行置换,以使它们与应用程序的世界坐标系相匹配。


推荐阅读