11.07.2015 Aufrufe

c't magazin für computer technik 24/2013 - since

c't magazin für computer technik 24/2013 - since

c't magazin für computer technik 24/2013 - since

MEHR ANZEIGEN
WENIGER ANZEIGEN
  • Keine Tags gefunden...

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Know-how I OpenGL ESWas man in einemstatischen Bild nichterkennt: Die endgültigeApp zeigt das Bildin Abhängigkeit vonder Positionierung desSmartphones an.Neigung und RotationDie Beispiel-App verwendet die Daten derMagnetfeld- und Beschleunigungssensoren,um den Zylinder zu rotieren und neigen.yawDazu braucht OpenGL ES eine Art Karte, diebeschreibt, welcher Punkt der Textur welchemEckpunkt des zu zeichnenden Objektsentspricht. Der Aufbau ist ähnlich wie beiden Dreiecken des Zylinders. Auch hier wirdein Array von Punkten für einen GL_TRIANGLE_STRIP angelegt. Allerdings beschreiben diePunkte keine Position im Raum, sondern diePosition auf dem Bild. Jeder Punkt in demArray texCoordßuffer korrespondiert dabei direktmit einem Punkt im Array vertexßuffer derEckpunkte für den Zylinder. Dadurch weißOpenGL ES, welcher Teil der Textur wo aufdem 3D-Körper gezeichnet werden soll.Jetzt kann man die Textur zusammen mitden Polygonen zeichnen (siehe das Listingunten). Wie gehabt, aktivieren die ersten dreiZeilen das Array mit den Eckpunkten desPolygons. Nun aber schaltet zusätzlich glEnable(GL 10.GL_TEXTURE_2D) das Texturieren ein. UndglEnableClientState(GL 1 O.GL_TEXTURE_COORD _ARRAY) teiltOpenGL ES mit, dass die Texturkoordinatenals Array vorliegen.Die Methode glßindTexture() aktiviert die Textur,die zuvor in der Methode setTexture() desZylinders gesetzt wurde. Abschließend setztglTexCoordPointer() das Textur-Array.Wichtig ist, dass dies alles vor dem Aufrufan glDrawArrays() geschieht. Sonst hätte es keinenEffekt, denn der Zylinder wäre ja schongezeichnet.Bei der Auswahl der Textur gibt es einigeszu beachten. Um die Kompatibilitätauch auf älteren Geräten zu erhalten, solltesie die Auflösung von 2048 x 2048 Pixelnicht überschreiten. Außerdem muss in diesereinfachen Version die Ausdehnung inx- und y-Richtung jeweils eine Zweierpotenzsein, da sonst nur eine weiße Flächeauf den Zylinder gezeichnet wird. Außerdemhat der Zylinder in dieser Beispiei-Appgrundsätzlich einen Radius von einer Einheitund eine Höhe von zwei Einheiten(vom Standpunkt des Betrachters eine nachoben und eine nach unten); das Bild solltealso in vertikaler Richtung 90 Grad abdeckenund in horizontaler Richtung 360 Grad.Um andere Bildformate unverzerrt darzustellen,ka nn man aber auch die Zylindermaßeentsprechend anpassen und gegebenenfallsden Öffnungswinkel bei der Bestimmungder Projektionsmatrix mittelsglPerspective() abändern, um das richtige Feelingzu bekommen.Alles dreht sich um die KameraUm das Panorama aus verschiedenen Blickrichtungenzeigen zu können, nimmt dieApp die Smartphone-Sensoren zu Hilfe. Mithilfedes Magnetfeldsensors lässt sich die horizontaleRichtung erfassen und mit dem Beschleunigungsmesserder vertikale Blickwinkel[2]. Das geschieht in der Klasse Grientation(siehe die gleichnamige .java-Datei im Quellcode),die im letzten Schritt zur Beispiei-Apphinzukommt.Android kann anhand der Sensordateneine fertige Rotationsmatrix erstellen, die dieDrehwinkel um die z-, x- und y-Achse enthält.Der BefehlSensorManager.getOrientation(rotationMatrix, orientation);liefert das Array orientation[], in dem an Stelle 0der Winkel für die horizontale und an Stelle2 der Winkel für die vertikale Lage des Gerätes(in Bogenmaß) untergebracht ist. ZumUmwandeln in Grad genügen folgende zweiZeilen in der Methode onSensorChanged(), dieimmer dann aufgerufen wird, wenn der imSensorEventlistener registrierte Sensor neueDaten bereitgestellt hat:float yaw = (float) Math.toDegrees(orientation[O]);tilt = (float) Math.toDegrees(orientation[2]);Da die Sensordaten nicht gefiltert oder geglättetsind, ist je nach Sensorgenauigkeit einZittern zu sehen, auch wenn das Gerät ruhigauf dem Tisch liegt. Um dies zu vermeidenund die Bewegung noch etwas flüssiger zumachen, kann man die ausgelesenen Wertenoch filtern. Eine Möglichkeit zur Filterungder Sensordaten beschreibt die Android­Referenz [3]. Diese zeigt die Anwendungeiner exponenziellen Glättung für ausgeleseneSensorwerte. Es ist zu beachten, dass beider Rotation um die x-Achse der Neigungswinkeltilt um 90 Grad zu erhöhen ist, da Androidals Ausgangspunkt für einen Winkelvon 0 Grad annimmt, dass das Smartphoneflach auf einer horizontalen Ebene liegt.AusblickDie hier vorgestellte App hat noch VerbesserungspotenziaLZum Beispiel könnte der Neigungswinkelbeschränkt werden, um nichtaus dem Zylinder oben oder unten herausblickenzu können. Des Weiteren bestündedie Möglichkeit, die Maße des Zylinders anzupassenoder ihn zu einer Sphäre zu erweiternund mit einer Textur zu belegen, die tatsächlicheine komplette Rundumsicht erlaubt.Schick wäre auch ein Texturmanager,um beispielsweise durch Schütteln des Geräteseine neue Textur zu laden. Oder eineZoomfunktion über die Lautstärketastenoder per Geste auf dem Touchscreen. Oder,oder, oder.(ola)LiteraturDie Methodedraw() zeichnetdie Polygonezusammen mitder Textur.1 public void draw(GL10 gll {2 gl.glEnable(GL10.GL_DEPTH_TESTl;3 g l . g l Enab l eC l i entSta te ( GL 10. GL_VERTEX_ARRAY);4 gl.glVertexPointer{3, GL10.GL_FLOAT, 0, vertexBuffer);5 gl.glEnable(GL10.GL_TEXTURE_2D);6 g l . g l Enab l eC l i entSta te ( GL 10. GL_TEXTURE_COORD_A RRA Yl;7 g l . g lBi ndTexture(GL 10. GL_TEXTURE_2D, tex tureBuffer. get (0));8 gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoordBufferl;9 gl.glDrawArrays(GL10.GL_TR!ANGLE_STRIP, 0, vertexßuffer.capacity() I 3);10 vertexßuffer.rewi nd(l;11 texCoordBuffer.rewindO;12 )[1] The Khronos Group, OpenGL ES - The Standardfor Embedded Accelerated 3D Graphics: www.khronos.org/opengles[2] Andreas Linke, Digitales Eierlaufen, Mit Bewegungssensorikeigene Android-Spiele progra m­mieren, <strong>c't</strong> 25/1 1,S.194[3] Android SensorEvent: http://developer.android.com/reference/android/hardware/SensorEvent.htmlwww.ct.de/73<strong>24</strong>2 12<strong>c't</strong>216<strong>c't</strong> <strong>2013</strong>, Heft <strong>24</strong>

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!