Как бросить 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)

Это создает матрицу, которая подходит для преобразования объектов, преобразования которых выражены относительно эталонной рамки отношения. Вы можете обнаружить, что вам нужно переставить столбцы, чтобы они соответствовали мировой системе координат вашего приложения.

Другие вопросы по тегам