2013-12-26 3 views
-2

У меня есть приложение. Он имеет два вида деятельности: один - пользовательская камера для съемки, а другая - для показа этой фотографии.Как я могу отобразить фотографию на мобильном устройстве, используя текущую ориентацию устройства и ориентацию на момент съемки фотографии?

Мое требование состоит в том, чтобы всякий раз, когда я делаю снимок, это изображение должно отображаться в соответствии с ориентацией устройства во время съемки изображения и в соответствии с текущей ориентацией устройства. Возможно, вы видели аналогичную функцию в панорамных приложениях.

Например, предположим, что я делаю снимок, и я перемещаю свой телефон, тогда мне нужно отобразить одно и то же изображение под углом. Как я могу это сделать?

ответ

13

Сначала вы должны оценить ориентацию устройства. Это лучше всего достигается с помощью слияния датчиков, см. Следующий учебник: http://www.thousand-thoughts.com/2012/03/android-sensor-fusion-tutorial/. Ориентация должна быть выражена как матрица или кватернион. Предпочитайте кватернионы, если у вас есть выбор, поскольку алгоритмы будут работать быстрее.

Для остальной части вашего приложения давайте использовать 3D-движок, чтобы отобразить фотографии, которые вы уже сделали. У вас есть выбор для 3D-движков, возьмите тот, с которым вы наиболее знакомы. Мы собираемся отображать фотографии, уже сделанные как текстурированные прямоугольники в 3D-движке.

Сначала мы должны определить размер этих текстурированных прямоугольников. Мы должны выбрать расстояние, на котором отображаются прямоугольники: это произвольно, давайте возьмем 1 метр. Затем нам нужно знать горизонтальное и вертикальное поля зрения угла обзора камеры, это зависит от устройства. Ради этого объяснения давайте представим, что мы используем 60-градусную горизонтальную и вертикальную поля зрения (квадратную) камеру. Фотографии эквивалентны 1 м х 1 м площади на расстоянии 1 м от наблюдателя. Это простая тригонометрия, надеюсь, вы сможете ее визуализировать. Дайте мне знать, если вам нужно больше объяснений.

Математически мы можем вычислить координаты прямоугольника, когда угол ориентации равен нулю. В нашем предыдущем примере квадрат имел бы координаты (+0.5, +0.5), (+0.5, -0.5), (-0.5, -0.5), (-0.5, +0.5). Каждый раз, когда мы фотографируем, мы вычисляем его координаты, вращающие координаты нулевого угла с помощью кватерниона/матрицы ориентации. Затем мы можем добавить в 3D-движок текстурированный прямоугольник в этих координатах и ​​с фотографией в виде текстуры.

Все, что нам нужно сделать, это обновить ориентацию камеры при изменении ориентации устройства. Это делается с помощью 3D-движка, возможно, вращая все зарегистрированные объекты с противоположностью кватерниона/матрицы вращения ориентации, но это действительно зависит от вашего API. Вы также можете наложить текущее изображение камеры, если хотите.

В приведенном выше объяснении я взял квадратную камеру с горизонтальным и вертикальным полем обзора на 60 градусов, чтобы помочь вам визуализировать происходящее. Математическая формула для координат прямоугольника с нулевым углом равна (X, Y), (X, -Y), (-X, -Y), (-X, Y), где X = sin (X_angle) и Y = sin (Y_angle).

У меня не было никакого кода, потому что я не хочу уклоняться от выбора технологий. Но с приведенным выше объяснением вы сможете реализовать то, что хотите, на выбранном вами языке и в библиотеках. Пожалуйста, сообщите нам, как это происходит.

+0

Thanx for rply Marcv81, но я хочу знать одно, что, когда этот угол соответствует нашему требованию, тогда как я могу сделать это изображение как камеру, если мы придем слева, тогда рендеринг изображений начинаем слева, и если мы придем с самого это изображение должно быть рендерером справа. Как я могу это сделать? Какова логика, я вычисляю проекцию предыдущих координат? как я могу вычислить проекцию? есть ли какой-либо код или проект с открытым исходным кодом. Пожалуйста, помогите мне .... Извините за плохой английский .. –

+1

Я вижу.Сначала я не мог понять ваш вопрос. Я отредактировал свой ответ, чтобы дать более подробную информацию и помочь вам достичь того, что, как я думаю, ваша цель (т. Е. Своего рода приложение для панорамы). – marcv81

+0

Привет, если вы можете включить какой-либо код, связанный с этим, тогда это будет легко для меня. Поэтому, пожалуйста, укажите код. Я был бы благодарен вам. Я использую датчик гироскопа, ускоритель и магнитометр для получения координаты захваченного изображения. –

Смежные вопросы