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