Я разрабатываю приложение дополненной реальности, которое (на данный момент) хочет отображать простой куб поверх поверхности и иметь возможность перемещаться в пространстве (как вращаясь, так и смещаясь), чтобы смотреть на куб под разными углами. Проблема калибровки камеры здесь не применяется, так как я прошу пользователя поместить iPhone на поверхность, на которую он хочет поместить куб, а затем нажать кнопку, чтобы изменить положение. Узнать вращение камеры очень просто с помощью Gyroscope и 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 все еще находится в самолете, значения акселерометра не равны нулю (я думаю, есть некоторый шум). Насколько я должен фильтровать эти значения? Я вообще должен их фильтровать?