如何将 CMRotationMatrix 转换为 float4x4?
How to cast a CMRotationMatrix into a float4x4?
我正在构建一个 Metal
应用程序,它使用 float4x4
矩阵来旋转 3D 对象 and/or 世界观。
该应用程序还在读取设备 attitude
,可以表示为 CMRotationMatrix
格式的旋转矩阵 (CoreMotion
)。
如何将我的 attitude.rotationMatrix
转换为 float4x4
对象?
您可以创建一个扩展,允许您从 CMRotationMatrix
的元素初始化 float4x4
:
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。您可能会发现您需要排列列,以便它们与您的应用程序的世界坐标系相匹配。
我正在构建一个 Metal
应用程序,它使用 float4x4
矩阵来旋转 3D 对象 and/or 世界观。
该应用程序还在读取设备 attitude
,可以表示为 CMRotationMatrix
格式的旋转矩阵 (CoreMotion
)。
如何将我的 attitude.rotationMatrix
转换为 float4x4
对象?
您可以创建一个扩展,允许您从 CMRotationMatrix
的元素初始化 float4x4
:
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。您可能会发现您需要排列列,以便它们与您的应用程序的世界坐标系相匹配。