QAugmentedReality - Local based augmented reality component
m (Galazzo - - →Shooting Photos) |
(Galazzo -) |
||
| Line 1: | Line 1: | ||
[[Category:Qt]][[Category:Qt Mobility]][[Category:Qt Quick]][[Category:Location]][[Category:Multimedia]][[Category:Symbian]][[Category:Code Snippet]] | [[Category:Qt]][[Category:Qt Mobility]][[Category:Qt Quick]][[Category:Location]][[Category:Multimedia]][[Category:Symbian]][[Category:Code Snippet]] | ||
| + | {{Note|This is an entry in the [[PureView Imaging Competition 2012Q2]]}} | ||
{{ArticleMetaData <!-- v1.2 --> | {{ArticleMetaData <!-- v1.2 --> | ||
|sourcecode= <!-- Link to example source code e.g. [[Media:The Code Example ZIP.zip]] --> | |sourcecode= <!-- Link to example source code e.g. [[Media:The Code Example ZIP.zip]] --> | ||
Revision as of 14:00, 14 June 2012
Contents |
Introduction
QAugmentedReality is a Augmented Reality engine that provides all functionalities to create your own local based augmented reality application like Nokia City Lens or social applications for example displaying your friends location or your parked car location direction.
Developer just need to setup for each item the longitude, latitude, description text, image and the engine will do the hard work to manage rendering, gps, compass.
Summary
The component built entirely from scratch, inherits all camera features adding GPS, Accelerometer and Compass support.
Anyway the component's strenght is the model support that allows you to easy manage your data to display. To add a pin into your scene you just need to add a QAugmentedRealityCameraItem element to QAugmentedRealityCameraModel to obtain a result like below:
Get Started with QAugmentedReality
- Download the project from here
- Include QAugmentedReality directory into your project
.pro
include(QAugmentedReality/AugmentedRealityLibrary.pri)
main.cpp
#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QtDeclarative>
#include "qaugmentedrealitycamera.h"
Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));
QmlApplicationViewer viewer;
qmlRegisterType<QAugmentedRealityCamera>("QAugmentedRealityCamera", 1, 0, "QAugmentedRealityCamera");
qmlRegisterType<QAugmentedRealityCameraModel>("QAugmentedRealityCamera", 1, 0, "QAugmentedRealityCameraModel");
qmlRegisterType<QAugmentedRealityCameraItem>("QAugmentedRealityCamera", 1, 0, "QAugmentedRealityCameraItem");
qmlRegisterType<QAugmentedRealityCameraDelegate>("QAugmentedRealityCamera", 1, 0, "QAugmentedRealityCameraDelegate");
// Resize the root QML element to view size
viewer.setResizeMode(QDeclarativeView::SizeRootObjectToView);
// Performance optimization flags
viewer.setAttribute(Qt::WA_OpaquePaintEvent);
viewer.setAttribute(Qt::WA_NoSystemBackground);
viewer.viewport()->setAttribute(Qt::WA_OpaquePaintEvent);
viewer.viewport()->setAttribute(Qt::WA_NoSystemBackground);
viewer.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationLockLandscape);
viewer.setMainQmlFile(QLatin1String("qml/QAugmentedRealitySample/main.qml"));
viewer.showExpanded();
return app->exec();
}
QML
import QtQuick 1.1
import QAugmentedRealityCamera 1.0
Rectangle {
id:home
width: 640
height: 360
color:"white"
QAugmentedRealityCameraModel {
id:pinsModel
pins: [
QAugmentedRealityCameraItem {
latitude: 41.891033
longitude:12.492599
message:"Rome"
source: ":/images/colosseo.jpg"
},
QAugmentedRealityCameraItem {
latitude: 45.463502
longitude:9.187946
message:"Milan"
source: ":/images/milan.jpg"
},
QAugmentedRealityCameraItem {
latitude: 48.856358
longitude:2.352047
message:"Paris"
infoBox: "#FFAA23"
source: ":/images/paris.jpg"
},
QAugmentedRealityCameraItem {
latitude: 51.50746
longitude:-0.127831
message:"London"
},
QAugmentedRealityCameraItem {
latitude: 52.518728
longitude:13.404465
message:"Berlin"
source: ":/images/berlin.jpg"
},
QAugmentedRealityCameraItem {
latitude: 40.714997
longitude:-74.006767
message:"New York"
source: ":/images/new-york.jpg"
},
QAugmentedRealityCameraItem {
latitude: 35.689649
longitude:139.691048
message:"Tokyo"
},
QAugmentedRealityCameraItem {
latitude: -37.813717
longitude:144.962955
message:"Melbourne"
infoBox: "blue"
}
]
}
QAugmentedRealityCamera {
id:camera
anchors.fill: parent
resolution: Qt.size(2592,1456)
model: pinsModel
}
Component.onCompleted:{
camera.start(camera.availableDevices[0])
pinsModel.append({
"latitude": 45.428094,
"longitude": 9.313946,
"message": "Peschiera Borromeo",
"source": ":/images/bino.jpg"
})
pinsModel.append({
"latitude": -34.603541,
"longitude": -58.381748,
"message": "Buenos Aires",
"infoBox" : "white"
})
}
}
QAugmentedRealityCamera
QAugmentedRealityCamera is the component that provide not only the camera display feature, but includes GPS, Accelerometer, and Compass to display Pins on screen and being able to move them depending on wacthing direction.
To add a pin you need setup a QAugmentedRealityCameraModel for the component.
QAugmentedRealityCameraModel
QAugmentedRealityCameraModel has a pins property that have to be filled with QAugmentedRealityCameraItem element.
You can add QAugmentedRealityCameraItem both in a static a dynamic way.
Adding a Pin statically
QAugmentedRealityCameraModel {
id:pinsModel
pins: [
QAugmentedRealityCameraItem {
latitude: 41.891033
longitude:12.492599
message:"Rome"
source: ":/images/colosseo.jpg"
}]
}
Adding a Pin dynamically
This approach is preferred when fetching data from a database.
Component.onCompleted:{
pinsModel.append({
"latitude": 45.428094,
"longitude": 9.313946,
"message": "Peschiera Borromeo",
"source": ":/images/bino.jpg"
})
}
QAugmentedRealityCameraItem
QAugmentedRealityCameraItem has the following properties:
- latitude
- longitude
- message - Is the description text displayed inside the pin
- infoBox - Is the color of the box drawn on the left of the pin. This is because to give you the possibility to have pins of different color for your own purpose
- source - As for infoBox this feature allow you to set an image for your pin. Transparent images are allowed. The infoBox background color will be displayed on transparent areas.
Shooting Photos
The component inherits from a base camera component, the same for QHdrCamera, so is possible to capture photos as a normal camera component. The result image will include the augmented reality items into the scene.
This feature will be improved as soon as pissible to be fitable with all resolutions.
Earth is not flat
Managing pins with very huge distances you can encounter in a strange effect because we are accustomed to watch maps using the Mercator projection. Let's consider the example showcased on the video above.
I loaded data with some of the most important cities in the world. Let's consider Milan, where I'm located, Berlin, Tokio and Melbourne. Watching to Berlin direction being located in Milan you could think that Berlin is located above Milan, Tokio on the right and Melbourne on the bottom right.

However this is an error due to Mercator projection in fact application will show Berlin, Tokio and Melbourne almost near in watching direction. This happens beacouse the earth has a sferical shape and points in a sphere are located using polar coordinate system.

In our example happens that the bearing between Milan, Berlin, Tokio and Melbourne and more the very huge distances that occurs, make it the application show these point of interest very near considering the direction watching angle.
From my point of view this is not a problem and reflects the real world, but you have to consider this aspect if you plan to manage very huge distances.
Anyway in the most common cases you will manage point of interest very near ( few kilometer/miles ) so the effect is reduced or near to zero.
Further Improvements
Improvements that will come as soon as possible:
- filter item based on max distance, for example to display just items far less then 150mt
- At time of writing the delegate is static. if possible to allow users to create their own delegate
- Provided a customizable delegate the next step is to provide a customizable model
- qmldir usage
Despite improvements that will come the component is easy and powerful enough to start creating your local based augmented reality applications and enjoy with them.
I'm available for any help about component and opened to suggestions for further improvements.

