Для контекста: я разрабатываю встроенную систему со встроенным акселерометром. Это устройство подключено к смартфону и передает данные (включая значения акселерометра).Теперь устройство может быть присоединено в любой ориентации к транспортному средству / велосипеду / ...
Проблема: Когда я получаю данные акселерометра от устройства, я хотел бы преобразовать их в «пространство автомобиля»,То, что я выяснил до сих пор, необходимо:
- Вектор, направленный вниз, в «пространстве устройства» (в основном гравитация)
- Вектор вперед, в «пространстве устройства» (указывая в прямом направлении транспортного средства)
В моем приложении вычислены оба этих вектора, однако теперь я немного застрял в части математики / реализации.
То, что я мог найти решение, это Изменение основы , однако я не смог
- Найти подтверждение того, что этот является способомсделать это
- Как это сделать в коде / псевдокоде
Я не хочу включать толстую математическую библиотеку для такой "маленькой" задачи и скорее поймуматематика за этим сама.
Текущее решение в моей голове, которое основано на моих давних воспоминаниях из университета-математики и для которых у меня нет доказательств: (псевдокод)
val nfv = normalize(forwardVector)
val ndv = normalize(downwardVector)
val fxd = cross(nfv, ndv)
val rotationMatrix = (
m11: fxd.x, m12: fxd.y, m13: fxd.z,
m21: ndv.x, m22: ndv.y, m23: ndv.z,
m31: nfv.x, m32: nfv.y, m33: nfv.z
)
// Then for each "incoming" vector
val transformedVector = rawVector * rotationMatrix
Вопрос: Это правильный способ сделать это?