Как бросить CMRotationMatrix в float4x4?
Я строю Metal
приложение, которое использует float4x4
матрицы для вращения трехмерных объектов и / или мировоззрения.
Приложение также читает устройство attitude
который может быть выражен как матрица вращения в CMRotationMatrix
формат (CoreMotion
).
Как я могу бросить свой attitude.rotationMatrix
в float4x4
объект?
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)
Это создает матрицу, которая подходит для преобразования объектов, преобразования которых выражены относительно эталонной рамки отношения. Вы можете обнаружить, что вам нужно переставить столбцы, чтобы они соответствовали мировой системе координат вашего приложения.