Помощ! Как да направя 3D компас?
- Forums:
Вече 3 дена се опитвам да напиша тримерен компас на Android. Уж беше задачка за няколко часа то какво стана. Само от сега да кажа, че всеки който разбира от геометрия и 3D графика може да помогне - Android framework-а няма нищо общо. Идеята е просто да нарисувам едно кубче, чията червена страна да сочи север. Когато въртя устройството, кубчето трябва да се върти така че червената страна да продължава да сочи север. Ето малко код:
public void onSensorChanged(int sensor, float[] values) { // yaw pitch roll
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
direction = values[2];
} else if (sensor == SensorManager.SENSOR_ORIENTATION) {
if (direction < 0) {
angleX = values[1];
angleY = -values[2];
angleZ = values[0];
} else {
angleX = -values[1];
angleY = -values[2];
angleZ = values[0];
}
}
}
В този handler получавам информация за това как е завъртян телефона именно чрез yaw, pitch, roll записани в този ред в масивът values. angleX, Y, Z са Ойлерови ъгли в градуси, с които на всеки кадър въртя кубчето по съответните му оси. Нека да направя уточнение за координатната система, която се използва в Android. И сега въпросът ми е защо кубчето не ми се върти както трябва? Само че така зададен въпросът, все още не е достатъчно ясен. Аз все пак за да съм го писал 3 дена, значи че много съм го тествал, което по принцип няма как да стане от емулатора а и нямам реален телефон. Затова си свалих SensorSimulator, което е нещо безценно и тепърва ще става още по-незаменим с навлизането на smartphones on steroids позволяващи augmented reality апликации. Проблемът тука е, че въпреки че слайдерите от долу показват интервалите, в които се менят градусите, те не са верни. В документацията, която пратих по-горе, е описана тази разлика, но това все пак не ме светва как да я взема под внимание. Например azimuth се движи монотонно от 0 до 360, докато pitch не качва повече от 90, но когато премине през определен интервал стойностите на другите две се изменят, към тях се добавят по 180 градуса. И това вече води до проблеми при мене. В един интервал на pitch, всичко работи както трябва и в моента, в който влезе в друг изведнъж кубчето се превърта на не знам си къде и после като изляза от интервала пак си е ок. Как да избегна това? Защо птосто като си му присвоя стойностите не става?
Нека да уточня за какво ползвам и direction променливата. Тя ми казва просто дали устройството е насочено с дисплея нагоре или надолу. Което го ползвах уж да засека кога влизам в гадният интервал на pitch, но и това не работи винаги.
Така...съжалявам, че писах много, но все пак проблема не е тривиален, само се надявам тези които могат да ми помогнат, наистина да го прочетат. Все пак и не е много сложно де, все пак това което съм публикувал в половината случаи работи.
Благодарен съм за бързи отговори, решения и насоки, дори и допълнителни въпроси, само го прочетете, че вече ще убия някого!