продолжение следует...
имаюсь разработкой приложения с дополненной реальностью, которое (на данный момент) хочет отобразить простой куб поверх поверхности и иметь возможность перемещаться в пространстве (как вращающемся, так и смещающемся), чтобы смотреть на куб под разными углами. Проблема калибровки камеры здесь не применима, поскольку я прошу пользователя поместить iPhone на поверхность, на которую он хочет поместить куб, а затем нажать кнопку, чтобы сбросить ориентацию. Узнать вращение камеры очень просто с помощью гироскопа и Core Motion. Я делаю это так:
if (referenceAttitude != nil) {
[attitude multiplyByInverseOfAttitude:referenceAttitude];
}
CMRotationMatrix mat = attitude.rotationMatrix;
GLfloat rotMat[] = {
mat.m11, mat.m21, mat.m31, 0,
mat.m12, mat.m22, mat.m32, 0,
mat.m13, mat.m23, mat.m33, 0,
0, 0, 0, 1
};
glMultMatrixf(rotMat);
Это работает очень хорошо. В любом случае, возникает больше проблем, когда я пытаюсь найти смещение в пространстве во время ускорения. Пример Apple Teapot с Core Motion просто добавляет значения x, y и z вектора ускорения к вектору положения. Это (помимо небольшого смысла) приводит к возврату объекта в исходное положение после ускорения. (Так как ускорение переходит от положительного к отрицательному или наоборот). Они сделали это так:
translation.x += userAcceleration.x;
translation.y += userAcceleration.y;
translation.z += userAcceleration.z;
Что я должен сделать, чтобы узнать смещение от ускорения в какой-то момент? (с известной разницей во времени). Глядя на некоторые другие ответы, мне кажется, что мне нужно дважды интегрировать, чтобы получить скорость от ускорения, а затем положение от скорости. Но в коде нет никакого примера, и я не думаю, что это действительно необходимо. Кроме того, существует проблема, заключающаяся в том, что, когда iPhone все еще находится в самолете, значения акселерометра не равны нулю (я думаю, что есть некоторый шум). Сколько я должен фильтровать эти значения? Я должен отфильтровать их вообще?