Freigeben über


В моем телефоне есть чайник…Примеры расширенной реальности для 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

Требования

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

Возможности

  1. Касания и жесты могут вращать и масштабировать трехмерный чайник (кнопка Touch).
  2. Движения Windows Phone могут вращать трехмерный чайник с помщью акселерометра и компаса (кнопка Gravity).
  3. Показ видео с фотокамеры телефона как фонового изображения для трехмерного чайника (кнопка CameraOn / 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