GPS Koordinaten

Zugriff auf Positions- und Richtungsdaten erhalten Entwickler im "Core Location" Framework, das von Apple als Teil des iOS SDKs mitgeliefert wird. Das Core Location Framework nutzt dafür automatisch die verfügbare Hardware, die von Geräteklasse zu Geräteklasse verschieden sein kann. Ein iPod Touch 2G kann beispielsweise die Position nur über WLAN Netzwerke in der Nähe bestimmen, während ein iPhone 3G bereits einen GPS Chip verbaut hat, die Ausrichtung aber nur anhand der Bewegungsdaten berechnen kann. Ein iPhone 4 wiederum besitzt zusätzlich einen digitalen Kompass. Um diese Unterschiede muss sich der Entwickler aber nicht kümmern.

Die wichtigste Klasse, die das Core Location Framework bereitstellt, ist CLLocationManager. Ein Objekt, das das CLLocationManagerDelegate Protokoll implementiert, kann von einem CLLocationManager Objekt über aktualisierte Positions- und Richtungsdaten informiert werden. Die beiden wichtigsten Delegate Methoden hierfür sind:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

und
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
in denen dem Delegate Objekt die aktuelle Position in Form eines CLLocation Objekts bzw. die Richtung als CLHeading übergeben wird.
Ein CLLocation Objekt beinhaltet zum einen Längengrad, Breitengrad und Höhe über dem Meeresspiegel, zum anderen Informationen über Genauigkeit und einen Zeitstempel. Darüber hinaus existiert eine Methode um den Abstand zwischen zwei CLLocation Objekten zu berechnen. Die Klasse kapselt ebenfalls Informationen über Geschwindigkeit und Bewegungsrichtung zum entsprechenden Zeitpunkt.
Die CLHeading Klasse beinhaltet Informationen zur Orientierung des Geräts bezüglich magnetischem oder geographischem Nordpol. Der Entwickler hat darüber hinaus Zugriff auf die Rohdaten (in Form eines 3D Vektors), die vom System verwendet wurden, um diese Informationen zu berechnen.


Audiofunktion

Für die Soundausgabe stehen eine Vielzahl von Frameworks und APIs zur Verfügung. Die Spanne reicht von AudioUnits mit Core Audio über AudioToolbox und OpenAL bis hin zu objektorientierten Frameworks wie AVFoundation, welches wir in unserem Projekt verwendet haben.

Die oben genannten C APIs bieten einen hohen Grad an Kontrolle über die Wiedergabe von Audioinhalten. In unserem Fall wollten wir lediglich eine Audiodatei abspielen. Deshalb haben wir uns letztlich für das Objective-C Framework AVFoundation entschieden.
AVFoundation ist sehr mächtig. Es bietet verschiedenste Möglichkeiten um Audio und Videoinhalte aufzunehmen, zu mixen und abzuspielen. Von den diversen Klassen, die hierfür zur Verfügung stehen wurde in diesem Projekt lediglich AVAudioPlayer verwendet.
Apple empfiehlt AVAudioPlayer für das Abspielen von Sounddateien, wenn keine niedrigen Latenzen oder das Streamen übers Netzwerk benötigt werden. Das Verwenden der Klasse gestaltet sich denkbar einfach: Ein AVAudioPlayer Objekt wird mit einem Pfad zu einer Audiodatei initialisiert. Danach muss lediglich die "play" Methode aufgerufen werden, um den Rest kümmert sich das System. Die Klasse bietet eine Vielzahl von Möglichkeiten, das Playback zu beeinflussen. Es existieren Methoden um mehrere AVAudioPlayer zu synchronisieren, man kann AVAudioPlayer Objekte im Stereo Spektrum positionieren sowie die Lautstärke regulieren. Um das Decoding und die hardwarebeschleunigte Wiedergabe von beispielsweise mp3 Dateien kümmert sich das Framework ohne weiteres Zutun.


3D Darstellung in OpenGL ES

Um 3D Inhalte auf dem iPhone zu zeichnen, wird die OpenGL ES (Open Graphics Library for Embedded Systems) Bibliothek verwendet. Diese Bibliothek bietet durch die Nähe zur Grafik-Hardware (GPU) enormen Performance-Schub für das Zeichnen von Grafiken und erlaubt natives Rendering und realistische Grafikeffekte in 3D.

Für unser Projekt haben wir die Umgebung des Neuenheimer Feldes sammt aller Häuser in Autodesks Maya 3D Programm nachgebaut und importieren dieses 3D Modell im Wavefront .obj Format in unser Projekt. Ein Objektkonverter generiert daraus als Grafikprimitive Dreiecke, die von OpenGL ES gezeichnet werden. Mittels Gestenerkennung wird ein Rotationsparameter errechnet und durch affine Transformation kann die komplette 3D Ansicht rotiert werden. Das Spreizen bzw. Zusammenziehen von zwei Fingern auf dem Bildschirm vergrößert/verkleinert den sichtbaren Bereich. Um aus jedem Blickwinkel die Auswahl einer Sehenswürdigkeit zu ermöglichen, wird für diese aus den 3d-Weltkoordinaten die entsprechende Bildschirmkoordinate errechnet. Der Berührungspunkt des Fingers wird mit der Koordinate verglichen und wenn beide übereinstimmen, wird für diese Sehenswürdigkeit die entsprechende Detailansicht dargestellt.