В моем телефоне есть чайник…Примеры расширенной реальности для Windows Phone 7.1/5


Грэг Дункан

Расширенная реальность (Augmented Reality, AR) – это просто здорово.

Увидеть цифровой и реальный мир смешанными в едином представлении – это то, о чем многие мечтали годами. Теперь устройства, которые у нас есть, достаточно мощны, чтобы сделать это реальным. Но прискорбно, что этого нельзя достичь с более ранними версиями Windows Phone 7.

Времена меняются…

С версией Mango мир расширенной реальности теперь открыт для устройств Windows Phone 7.1/5. Сегодняшний проект – один из примеров этого.

Пример Windows Phone AR

Пример приложения расширенной реальности для Windows Phone «Mango» добавляет на дисплей на фоне реального видео с фотокамеры виртуальный чайник. Акселерометр и компас управляют ориентацией чайника, исходя из ориентации телефона.

Пример разработан в C# с XNA и Silverlight.

clip_image002

Требования

Пример требует наличия Windows Phone SDK 7.1 для построения приложения и Windows Phone «Mango» для работы.

Возможности

  1. Касания и жесты могут вращать и масштабировать трехмерный чайник (кнопка Touch).
  2. Движения Windows Phone могут вращать трехмерный чайник с помщью акселерометра и компаса (кнопка Gravity).
  3. Показ видео с фотокамеры телефона как фонового изображения для трехмерного чайника (кнопка Camera On/Off).

Приемы

  1. Получение совместного доступа к графическому устройству, использование вместе XNA и Silverlight
  2. Исходный класс Teapot, использование типа IVertexType, базирующегося на обычной вершине, и BasicEffect для рендеринга
  3. Акселерометр и компас, получение вектора гравитации и направления на север
  4. Фотокамера, использование картинки с фотокамеры в качестве фона для виртуального объекта

Пара снимков, как это выглядит в эмуляторе:

clip_image004clip_image006

clip_image008

Решение:

clip_image010

Наконец снимок метода OnUpdate;

 

private void OnUpdate(object sender, GameTimerEventArgs e)
{
// TODO: Add your update logic here
if (useGravity)
{
if (useMotion)
{
teapot.World = Matrix.CreateFromYawPitchRoll(0, MathHelper.PiOver2, 0) * motion.CurrentValue.Attitude.RotationMatrix;
}
else if (useAccelerometer)
{
Vector3 original = new Vector3(0f, 0f, 1f);
Vector3 current = new Vector3(accelSensor.CurrentValue.Acceleration.X, accelSensor.CurrentValue.Acceleration.Z, -accelSensor.CurrentValue.Acceleration.Y);
current.Normalize();
// Cross product to get axis
Vector3 axis = Vector3.Cross(original, current);
axis.Normalize();
// dot product to get angle
float dot = Vector3.Dot(original, current);
float angle = (float)Math.Acos((double)dot);
teapot.World = Matrix.CreateFromAxisAngle(axis, angle);
}
}
else
{
HandleGesture();
teapot.World = drag;
if (pinch != Matrix.Identity) teapot.View = pinch;
}
}

Это простой проект, но иногда достаточно лишь легкого толчка... clip_image012

Comments (0)

Skip to main content