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