2012-05-30 14 views
5

Pamiętam z WWDC, że odbyła się rozmowa pokazująca imbryk w OpenGL ES, który obracał się wraz z ruchem urządzenia. Wyglądało to tak, jakby czajniczek stał nieruchomo w przestrzeni.Jak uzyskać obrót wokół osi Y w stosunku do sposobu przechowywania urządzenia przez użytkownika?

Po uruchomieniu aplikacji czajniczek zaczął się w określonej pozycji. Następnie, gdy urządzenie zostało obrócone, czajniczek również obrócił się, aby stać w miejscu.

Podczas tej rozmowy wspomnieli, że musimy uzyskać "ramkę odniesienia", np. po uruchomieniu aplikacji, która mówi nam, jak użytkownik początkowo trzymał urządzenie.

Na przykład oto oś akcelerometr:

accelerometer

Chcę wiedzieć, obrót wokół osi Y, ale w stosunku do tego, jak użytkownik trzyma urządzenie. Tak więc, gdy użytkownik trzyma go w pozycji pionowej i obraca się wokół Y, muszę znać tę wartość obrotu.

Myślę, że kluczem jest usunięcie grawitacji z odczytów? Poza tym celuję w iPhone 4/4S z żyroskopami, ale myślę, że CoreMotion automatycznie je zintegruje.

Jak mogę zorientować się, ile użytkownik obrócił urządzenie wokół osi Y?

+0

może to dać pomysł http://stackoverflow.com/questions/6464569/changing-uiviews-during-uiinterfaceorientation-on-ipad –

+0

@ Praveen-K nie, nie chodzi o zdarzenia orientacji urządzenia. Chcę poznać dokładny kąt obrotu wokół Y w stosunku do tego, jak użytkownik zaczął trzymać urządzenie. –

+0

Cóż, zawsze możesz wiedzieć o uruchomieniu aplikacji, w której orientacji użytkownik trzyma urządzenie, i na podstawie tego warunku możesz obliczyć oś y (nie jestem pewien, czy pytasz, gdzie użytkownik trzyma urządzenie pod dziwnym kątem: P_) –

Odpowiedz

2

Z innego pytania Why is this CMDeviceMotionHandler never called by CoreMotion? Wiem, że pracujesz nad systemem iOS 4 - w systemie iOS5 sytuacja nieco się zmieniła. Generalnie dane żyroskopowe lub nawet lepsze połączenie czujników z danymi przyspieszeniomierza i żyroskopu, jak w DeviceMotion, jest najlepszym sposobem uzyskania właściwych wyników.

Jeśli masz już uruchomione, będziesz musiał pracować z metodą CMAttitude's multiplyByInverseOfAttitude, aby uzyskać wszystkie wyniki CMDeviceMotion w stosunku do ramki referencyjnej. Po prostu zapisz referencję pierwszego CMAttitude w elemencie klasy i wywołaj z nim multiplyByInverseOfAttitude na wszystkich kolejnych połączeniach. Następnie wszyscy członkowie CMDeviceMotion.attitude będą odnosić się do tej ramki odniesienia.

Aby uzyskać obrót wokół osi Y, pierwszym podejściem jest przyjęcie kątów Eulera, tj. CMAttitude.roll. Jeśli potrzebujesz tylko śledzić małe ruchy, może to być w porządku. Jeśli ruchy są bardziej rozległe, natrafisz na kłopoty dotyczące Gimbal Lock. Aby uzyskać stabilne wyniki, potrzebujesz zaawansowanych technik, takich jak kwaternianie, ale brzmi to jak własne pytanie.

Powiązane problemy