В моем телефоне есть чайник…Примеры расширенной реальности для Windows Phone 7.1/5
Расширенная реальность (Augmented Reality, AR) – это просто здорово.
Увидеть цифровой и реальный мир смешанными в едином представлении – это то, о чем многие мечтали годами. Теперь устройства, которые у нас есть, достаточно мощны, чтобы сделать это реальным. Но прискорбно, что этого нельзя достичь с более ранними версиями Windows Phone 7.
Времена меняются…
С версией Mango мир расширенной реальности теперь открыт для устройств Windows Phone 7.1/5. Сегодняшний проект – один из примеров этого.
Пример приложения расширенной реальности для Windows Phone «Mango» добавляет на дисплей на фоне реального видео с фотокамеры виртуальный чайник. Акселерометр и компас управляют ориентацией чайника, исходя из ориентации телефона.
Пример разработан в C# с XNA и Silverlight.
Требования
Пример требует наличия WindowsPhoneSDK 7.1 для построения приложения и WindowsPhone « Mango » для работы.
Возможности
- Касания и жесты могут вращать и масштабировать трехмерный чайник (кнопка Touch).
- Движения Windows Phone могут вращать трехмерный чайник с помщью акселерометра и компаса (кнопка Gravity).
- Показ видео с фотокамеры телефона как фонового изображения для трехмерного чайника (кнопка CameraOn / Off).
Приемы
- Получение совместного доступа к графическому устройству, использование вместе XNA и Silverlight
- Исходный класс Teapot, использование типа IVertexType, базирующегося на обычной вершине, и BasicEffect для рендеринга
- Акселерометр и компас, получение вектора гравитации и направления на север
- Фотокамера, использование картинки с фотокамеры в качестве фона для виртуального объекта
Пара снимков, как это выглядит в эмуляторе:
Решение:
Наконец снимок метода 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;
}
}
Это простой проект, но иногда достаточно лишь легкого толчка...