我正在构建一个Metal
应用程序,该应用程序使用float4x4
矩阵旋转3D对象和/或世界视图。
该应用程序还在读取设备attitude
,可以将其表示为CMRotationMatrix
格式(CoreMotion
)的旋转矩阵。
如何将attitude.rotationMatrix
转换为float4x4
对象?
最佳答案
您可以创建一个扩展,该扩展允许您从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表示的对象。您可能会发现需要对列进行置换,以使它们与应用程序的世界坐标系匹配。