Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Расширенная реальность (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;
}
}
Это простой проект, но иногда достаточно лишь легкого толчка...