26.02.2014 Aufrufe

smart developer Ein Code für alle (Vorschau)

Erfolgreiche ePaper selbst erstellen

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

Entwicklung<br />

Android und OpenGL<br />

eine standardmäßige Konfiguration <strong>für</strong><br />

OpenGL, außer der Stelle <strong>für</strong> die Texturen.<br />

Hier benutzten wir eine Hilfsklasse <strong>für</strong> einen<br />

Würfel, worauf wir später noch zurückkehren.<br />

Zuerst führen Sie aber die OpenGL-Konfiguration<br />

zu Ende.<br />

Ansichtfenster und Projektion<br />

Nach den Grundeinstellungen <strong>für</strong> OpenGL<br />

stellen Sie nun im nächsten Schritt das Ansichtfenster<br />

(Viewport) ein. Ihre Anwendung<br />

erhält die <strong>alle</strong>rersten Informationen über das<br />

Ansichtfenster in der onSurfaceChanged()-<br />

Rückrufmethode. Mit dem Aufruf dieser Methode<br />

bekommt die Anwendung Informationen<br />

über die Abmessungen der Zeichnungsfläche<br />

eines bestimmten Gerätes. Die <strong>alle</strong>rwichtigste<br />

Information <strong>für</strong> die meisten Anwendungen<br />

ist hier das Seitenverhältnis des<br />

Bildschirms. Wie bei den meisten OpenGL-<br />

Implementationen üblich, konfigurieren Sie<br />

zuerst die Projektionsmatrix und fügen dann<br />

<strong>alle</strong> Objekte hinzu, bei denen es sinnvoll ist,<br />

sie innerhalb der (oder in Relation zur) Projektionsfläche<br />

zu definieren.<br />

Listing 3 zeigt eine perspektivische Konfiguration<br />

sowie den Standort des Betrachters.<br />

Im Folgenden fügen Sie diesem Raum einige<br />

Lichtquellen hinzu. (Die Lichtquellen sind<br />

grundsätzlich relativ zum Betrachter und fix<br />

platziert, unabhängig davon, wie viele Objekte<br />

sich in der Szene bewegen. Lichter von<br />

Szenen-Objekten im Modellraum einzuführen,<br />

ist mit mehr Aufwand auch möglich.)<br />

Listing 7: setTexture()<br />

mCoordinateBuffer = OpenGLUtilities<br />

.getFloatBufferFromFloatArray(textu<br />

reCoords);<br />

mTextureID = textureID;<br />

gl.glBindTexture(GL10.GL_TEXTURE_2D,<br />

mTextureID);<br />

Bitmap bitmap = BitmapFactory.<br />

decodeResource(c.getResources(),<br />

drawableID);<br />

Bitmap bitmapSq = Bitmap<br />

.createScaledBitmap(bitmap, 512, 512,<br />

false);<br />

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,<br />

bitmapSq, 0);<br />

bitmap.recycle();<br />

bitmapSq.recycle();<br />

gl.glTexParameterf(GL10.GL_TEXTURE_2D,<br />

GL10.GL_TEXTURE_MIN_FILTER,<br />

GL10.GL_NEAREST);<br />

gl.glTexParameterf(GL10.GL_TEXTURE_2D,<br />

GL10.GL_TEXTURE_MAG_FILTER,<br />

GL10.GL_LINEAR);<br />

Beachten Sie noch die in Listing 3 verwendete<br />

GLU-Hilfsklasse, welche die Entsprechung<br />

<strong>für</strong> GLUT (OpenGL Utility Toolkit) in<br />

Android darstellt.<br />

Frames zeichnen<br />

Mit dem soeben konfigurierten OpenGL ES<br />

können Sie bereits zeichnen. Zum Zeichnen<br />

wird die onDrawFrame()-Rückrufmethode aufgerufen.<br />

In Ihrer Implementierung dieser Methode<br />

legen Sie dann <strong>alle</strong> regulären OpenGL-<br />

Aufrufe <strong>für</strong> die Erstellung einer Szene ab.<br />

Listing 4 zeigt den Inhalt einer ziemlich einfachen<br />

Implementierung <strong>für</strong> die<br />

onDrawFrame()-Methode, die einen Honeycomb-Würfel<br />

zeichnen soll.<br />

Wie Listing 4 zeigt, ist das Zeichnen mit<br />

OpenGL ES auf Android sehr ähnlich, wenn<br />

nicht gleich, wie auf anderen Plattformen.<br />

Allerdings sehen Sie hier eine andere Referenz<br />

zu einer Klasse <strong>für</strong> das Zeichnen eines<br />

Würfels. Als Nächstes schildern wir die<br />

damit zusammenhängenden Besonderheiten.<br />

Umgang mit Puffern<br />

Wie es oft der Fall im OpenGL-Gebrauch ist:<br />

Arrays speichern Eckpunkte, Normalen und<br />

Indizes. Diese Arrays können Sie anfangs mit<br />

Listing 4: onDrawFrame()<br />

public void onDrawFrame(GL10 gl) {<br />

}<br />

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);<br />

gl.glMatrixMode(GL10.GL_MODELVIEW);<br />

gl.glLoadIdentity();<br />

gl.glTranslatef(0f, 0f, 0f);<br />

gl.glRotatef(mRotateAngle, 1f, 1f, 0f);<br />

texHoneyCube.draw(gl);<br />

...<br />

Listing 5: OpenGL-fähiger Puffer<br />

ByteBuffer tempBuffer = ByteBuffer.allocateDirect(array.length * 4);<br />

tempBuffer.order(ByteOrder.nativeOrder());<br />

FloatBuffer buffer = tempBuffer.asFloatBuffer();<br />

buffer.put(array);<br />

buffer.position(0);<br />

Listing 6: Hilfsmethoden<br />

private FloatBuffer mVertexBuffer;<br />

float vertices[] = {1f, 0f, 0.5f, .... };<br />

// Inside‐Methode vor dem Gebrauch:<br />

mVertexBuffer = OpenGLUtilities.getFloatBufferFromFloatArray(vertices);<br />

// Wenn während des Zeichnens verwendet:<br />

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);<br />

<strong>smart</strong>-<strong>developer</strong>.de 02/2011 87

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!