Rozwijam aplikację rzeczywistości rozszerzonej, która (w tej chwili) chce wyświetlić prostą kostkę na powierzchni i być w stanie poruszać się w przestrzeni (zarówno obrotowej, jak i przemieszczającej), aby spójrz na kostkę pod różnymi kątami. Problem kalibracji kamery nie ma tu zastosowania, ponieważ poproszę użytkownika, aby umieścił iPhone'a na powierzchni, na której chce umieścić kostkę, a następnie naciśnij przycisk, aby zresetować ustawienie. Aby dowiedzieć się, obracanie kamery jest bardzo proste dzięki żyroskopowi i rdzenia. Robię to w następujący sposób:Uzyskiwanie danych z akcelerometru za pomocą 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);
Działa to naprawdę dobrze. Więcej problemów powstaje w każdym razie, gdy próbuję znaleźć przemieszczenie w przestrzeni podczas przyspieszania. Przykład Apple Teapot z Core Motion po prostu dodaje wartości x, yiz wartości wektora przyspieszenia do wektora położenia. To (oprócz braku sensu) powoduje powrót przedmiotu do pierwotnej pozycji po przyspieszeniu. (Ponieważ przyspieszenie idzie od dodatniego do ujemnego lub odwrotnie). Zrobili to tak:
translation.x += userAcceleration.x;
translation.y += userAcceleration.y;
translation.z += userAcceleration.z;
Co należy zrobić, aby dowiedzieć się, przemieszczenie z przyspieszeniem w niektórych istant? (ze znaną różnicą czasu). Patrząc na kilka innych odpowiedzi, wydaje mi się, że muszę dwa razy zintegrować, aby uzyskać prędkość od przyspieszenia, a następnie pozycję z prędkości. Ale nie ma żadnego przykładu w kodzie i nie sądzę, że jest to naprawdę konieczne. Problemem jest również to, że kiedy iPhone jest nadal w płaszczyźnie, wartości akcelerometru nie są zerowe (wydaje mi się, że są jakieś zakłócenia). Ile powinienem odfiltrować te wartości? Czy mam je w ogóle filtrować?
Problem d = 0,5 * a * t^2 na ogół jest to, że wymaga to stałego przyspieszenia, jak opisano w http://en.wikipedia.org/wiki/ Przyspieszenie. – Kay
Zakładając, że v (0) == 0 jest krytyczne, ale potrzebujemy punktu, aby zacząć i powinieneś z tym żyć. IMO, im bardziej krytyczna część pojawia się po kilku sekundach, kiedy masz == 0 i v! = 0 (jak wyjaśniono w mojej odpowiedzi). – Kay