GATAV 9. Goodby flatland Welcome to 3D!

Similar documents
Android and OpenGL. Android Smartphone Programming. Matthias Keil. University of Freiburg

Mobile Application Programing: Android. OpenGL Operation

Mobile Application Programing: Android. OpenGL Operation

COMP3421 Computer Graphics

OpenGL on Android. Lecture 7. Android and Low-level Optimizations Summer School. 27 July 2015

Understanding M3G 2.0 and its Effect on Producing Exceptional 3D Java-Based Graphics. Sean Ellis Consultant Graphics Engineer ARM, Maidenhead

Mobile Application Programming: Android. OpenGL Operation

Module 13C: Using The 3D Graphics APIs OpenGL ES

WebGL (Web Graphics Library) is the new standard for 3D graphics on the Web, designed for rendering 2D graphics and interactive 3D graphics.

New topic for Java course: Introduction to 3D graphics programming

Introduction to OpenGL. CS 4620 Balazs Kovacs, 2014 Daniel Schroeder, 2013 Pramook Khungurn, 2012

The Rendering Pipeline (1)

Hands-On Workshop: 3D Automotive Graphics on Connected Radios Using Rayleigh and OpenGL ES 2.0

CS451Real-time Rendering Pipeline

CENG 477 Introduction to Computer Graphics. Graphics Hardware and OpenGL

JOGL 3D GRAPHICS. Drawing a 3D line. In this chapter, let us see how to deal with 3D graphics.

Dave Shreiner, ARM March 2009

Shaders. Slide credit to Prof. Zwicker

Coding OpenGL ES 3.0 for Better Graphics Quality

GLSL Overview: Creating a Program

CS293: Java Graphics with JOGL, Solutions

Programming of Mobile Services, Spring 2012

PROCEDURAL OBJECT MODELING

Viewport 2.0 API Porting Guide for Locators

Ciril Bohak. - INTRODUCTION TO WEBGL

CS 428: Fall Introduction to. OpenGL primer. Andrew Nealen, Rutgers, /13/2010 1

Introduction to Android

F03_c. 观摩 : SurfaceView 小框架 基於軟硬整合觀點. 的特殊性设计 ( c) By 高煥堂

ECE 104 Fundamentals of Computer Graphics Project 1

To Do. Computer Graphics (Fall 2008) Course Outline. Course Outline. Methodology for Lecture. Demo: Surreal (HW 3)

WebGL. WebGL. Bring 3D to the Masses. WebGL. The web has text, images, and video. We want to support. Put it in on a webpage

CS452/552; EE465/505. Review & Examples

Graphics Programming. Computer Graphics, VT 2016 Lecture 2, Chapter 2. Fredrik Nysjö Centre for Image analysis Uppsala University

Performance OpenGL Programming (for whatever reason)

OPENGL AND GLSL. Computer Graphics

Programming of Graphics

API Background. Prof. George Wolberg Dept. of Computer Science City College of New York

E.Order of Operations

Rendering. Part 1 An introduction to OpenGL

IN ACTION THIRD EDITION. W. Frank Ableson Robi Sen Chris King C. Enrique Ortiz MANNING

WebGL. Announcements. WebGL for Graphics Developers. WebGL for Web Developers. Homework 5 due Monday, 04/16. Final on Tuesday, 05/01

Introduction to the Graphics Module Framework

2: Introducing image synthesis. Some orientation how did we get here? Graphics system architecture Overview of OpenGL / GLU / GLUT

Ulf Assarsson Department of Computer Engineering Chalmers University of Technology

GATAV 5. Animations Using a Game Loop

GPU Quality and Application Portability

LECTURE 02 OPENGL API

Spring 2009 Prof. Hyesoon Kim

Mobile Performance Tools and GPU Performance Tuning. Lars M. Bishop, NVIDIA Handheld DevTech Jason Allen, NVIDIA Handheld DevTools

Spring 2011 Prof. Hyesoon Kim

Introduction to Computer Graphics. Hardware Acceleration Review

MORE OPENGL. Pramook Khungurn CS 4621, Fall 2011

CS 4620 Program 3: Pipeline

Adding New Features to the CS 5625 Framework. Pramook Khungurn

object (say a cube) will be made up of triangles, each with three vertices, each with known object coordinates.

Real-Time Rendering (Echtzeitgraphik) Michael Wimmer

PowerVR Framework. October 2015

LSU EE Homework 5 Solution Due: 27 November 2017

CHAPTER 1 Graphics Systems and Models 3

Profiling and Debugging Games on Mobile Platforms

CS230 : Computer Graphics Lecture 4. Tamar Shinar Computer Science & Engineering UC Riverside

Geometry Primitives. Computer Science Department University of Malta. Sandro Spina Computer Graphics and Simulation Group. CGSG Geometry Primitives

GPU Programming EE Final Examination

COMP3421. Introduction to 3D Graphics

OpenGL BOF Siggraph 2011

3D Programming. 3D Programming Concepts. Outline. 3D Concepts. 3D Concepts -- Coordinate Systems. 3D Concepts Displaying 3D Models

Rasterization Overview

Rendering Grass with Instancing in DirectX* 10

INF555. Fundamentals of 3D. Lecture 4: Debriefing: ICP (kd-trees) Homography Graphics pipeline. Frank Nielsen

What was removed? (1) OpenGL ES vs. OpenGL

JOGL-ES 1. Rotating Boxes

OpenGL SUPERBIBLE. Fifth Edition. Comprehensive Tutorial and Reference. Richard S. Wright, Jr. Nicholas Haemel Graham Sellers Benjamin Lipchak

Graphics Programming

CS4621/5621 Fall Computer Graphics Practicum Intro to OpenGL/GLSL

6.837 Introduction to Computer Graphics Assignment 5: OpenGL and Solid Textures Due Wednesday October 22, 2003 at 11:59pm

ArcGIS Runtime: Maximizing Performance of Your Apps. Will Jarvis and Ralf Gottschalk

Today s Agenda. Basic design of a graphics system. Introduction to OpenGL

GPU Memory Model Overview

Game Programming with. presented by Nathan Baur

M3G Overview. Tomi Aarnio Nokia Research Center

Programming Guide. Aaftab Munshi Dan Ginsburg Dave Shreiner. TT r^addison-wesley

The Application Stage. The Game Loop, Resource Management and Renderer Design

Introduction to 3D Graphics

The Graphics Pipeline and OpenGL I: Transformations!

CS770/870 Spring 2017 Open GL Shader Language GLSL

CS770/870 Spring 2017 Open GL Shader Language GLSL

Graphics Hardware and OpenGL

Lecture 1 Introduction to Android. App Development for Mobile Devices. App Development for Mobile Devices. Announcement.

Information Coding / Computer Graphics, ISY, LiTH. OpenGL! ! where it fits!! what it contains!! how you work with it 11(40)

Instruction for IVR interface

An Introduction to 2D OpenGL

the gamedesigninitiative at cornell university Lecture 12 Scene Graphs

OpenGL Essentials Training

Transformations. Standard Transformations. David Carr Virtual Environments, Fundamentals Spring 2005 Based on Slides by E. Angel

Transformations. Overview. Standard Transformations. David Carr Fundamentals of Computer Graphics Spring 2004 Based on Slides by E.

Optimizing and Profiling Unity Games for Mobile Platforms. Angelo Theodorou Senior Software Engineer, MPG Gamelab 2014, 25 th -27 th June

Programming with OpenGL Part 3: Shaders. Ed Angel Professor of Emeritus of Computer Science University of New Mexico

Android Studio Game Development

Outline. Introduction Surface of Revolution Hierarchical Modeling Blinn-Phong Shader Custom Shader(s)

Sign up for crits! Announcments

Transcription:

GATAV 9. Goodby flatland Welcome to 3D!

TOC 1. OpenGL ES the 3D-API 2. The buffer concept - a technical necessity 3. Introducing GLSurfaceView the 3D-View 4. GLSurfaceView.Renderer the interface to 3D-content 5. Hello World 3D 6. Add Motion and Interaction 7. Add freaky Viewing 8. Highly-skilled construction worker 9. Distinguished architect Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 2

OpenGL ES the 3D-API for embedded accelerated 3D graphics low-level 3D-API to process graphics on a dedicated GPU consists of well-defined subsets of desktop OpenGL main differences to OpenGL: no glbegin/glend; everything (coordinates, colors, textures,...) is handled by arrays no quad or polygon primitives; nothing but triangles, triangle strips, triangle fans absence of higher primitives (cube, sphere, cylinder,...); neither GLU nor GLUT assistance a lot of must be... Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 3

OpenGL ES - Versions OpenGL ES 1.X for fixed function hardware OpenGL 1.5 specifications OpenGL ES 2.X: for programmable hardware OpenGL 2.0 specifications ability to create vertex and fragment shaders no glpushmatrix/glpopmatrix,... you have to write everything yourself! warning: not compatible with Open GL ES 1.X! precise specifications: http://www.khronos.org/opengles/ Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 4

OpenGL ES Connection to Java EGL is an interface between Khronos rendering APIs (such as OpenGL ES) and the underlying native platform windowing system import javax.microedition.khronos.egl.eglconfig; OpenGL ES is implemented in C! access to C-library functions via wrapper class GL10 import javax.microedition.khronos.opengles.gl10; an implementation of the GL interface big problem: C extensivly uses pointers to arrays, Java doesn t have such evil properties solution: use new objects named buffers Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 5

The buffer concept - a technical necessity A ByteBuffer is a fixed-capacity buffer that holds byte values ByteBuffers are used to create and transport arrays of values of various datatypes to OpenGL ES ByteBuffers must be placed on a particular part of the heap to hide from the garbage collector FloatBuffer, ShortBuffer, IntBuffer,... are used to wrap and fill the underlying ByteBuffer Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 6

The buffer concept Example FloatBuffer vertexbuffer; v0 y v1 float geometry[] = { x -0.5f, 0.5f, 0.5f, // v0-0.5f, -0.5f, 0.5f, // v2 z 0.5f, 0.5f, 0.5f }; // v1 v2 // Buffers with multi-byte datatypes (e.g., short, int, float) // must have their byte order (big oder little endian) // set to native order v3 ByteBuffer vertexbb = ByteBuffer.allocateDirect(geometry.length*4); vertexbb.order(byteorder.nativeorder()); vertexbuffer = vertexbb.asfloatbuffer(); // creation from the ByteBuffer vertexbuffer.put(geometry); // fill it vertexbuffer.position(0); // rewind it Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 7

Introducing GLSurfaceView the 3D-View an API class that: manages an EGL display enabling OpenGL ES to render into a surface provides the glue code to connect OpenGL ES to the View system provides the glue code to make OpenGL ES work with the Activity life-cycle Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 8

Introducing GLSurfaceView creates and manages a separate dedicated rendering thread to enable smooth animation supports both on-demand and continuous rendering mode accepts and holds a user-provided Renderer object that does the actual rendering is usually subclassed to handle touch events by overriding the appropriate methods be carefull: you may need to communicate with the Renderer object running in the rendering thread! standard Java cross-thread communication call queueevent(runnable) Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 9

GLSurfaceView.Renderer the interface to 3D-content Create your own Renderer class implementing this interfaces methods: public void onsurfacecreated(gl10 gl, EGLConfig config) called whenever the drawing context has to be (re)created public void onsurfacechanged(gl10 gl, int width, int height) called when the surface changes size public void ondrawframe(gl10 gl) called every frame responsible for drawing the whole scene Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 10

Hello World 3D Example public class GLES01 extends Activity { private GLSurfaceView touchableglsurfaceview; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); touchableglsurfaceview = new TouchableGLSurfaceView(this); setcontentview(touchableglsurfaceview); } @Override protected void onresume() { super.onresume(); touchableglsurfaceview.onresume(); } @Override protected void onpause() { super.onpause(); touchableglsurfaceview.onpause(); } } Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 11

Hello World 3D Example class TouchableGLSurfaceView extends GLSurfaceView { private OurRenderer ourrenderer; public TouchableGLSurfaceView(Context context) { super(context); ourrenderer = new OurRenderer(); setrenderer(ourrenderer); } // the implementation of the renderer interface private class OurRenderer implements GLSurfaceView.Renderer { private FloatBuffer vertexbuffer; public OurRenderer() { float geometry[] = { -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f }; ByteBuffer vertexbb = ByteBuffer.allocateDirect(geometry.length*4); vertexbb.order(byteorder.nativeorder()); vertexbuffer = vertexbb.asfloatbuffer(); vertexbuffer.put(geometry); vertexbuffer.position(0); } Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 12 v0 v2 y v3 v1 x z

Hello World 3D Example // the implementation of the renderer interface (cont.) // creation of viewport // initialization of some opengl features public void onsurfacecreated(gl10 gl, EGLConfig config) { gl.gldisable(gl10.gl_dither); gl.glhint(gl10.gl_perspective_correction_hint, GL10.GL_FASTEST); } gl.glclearcolor(0, 0, 0, 1); gl.glenable(gl10.gl_cull_face); //gl.glshademodel(gl10.gl_flat); gl.glshademodel(gl10.gl_smooth); gl.glenable(gl10.gl_depth_test); Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 13

Hello World 3D Example // the implementation of the renderer interface (cont.) // resize of viewport // set projection matrix public void onsurfacechanged(gl10 gl, int width, int height) { gl.glviewport(0, 0, width, height); } float aspectratio = (float) width / height; gl.glmatrixmode(gl10.gl_projection); gl.glloadidentity(); GLU.gluPerspective(gl, 45.0f, aspectratio, 1.0f, 1000.0f); GLU.gluLookAt(gl,0.0f,0.0f,5.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f); gl.glmatrixmode(gl10.gl_modelview); Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 14

Hello World 3D Example // the implementation of the renderer interface (cont.) public void ondrawframe(gl10 gl) { // the first thing to do: clear screen and depth buffer gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); // reset modelview matrix gl.glmatrixmode(gl10.gl_modelview); gl.glloadidentity(); } }} gl.glcolor4f(1.0f, 0.0f, 0.0f, 0.0f); gl.glenableclientstate(gl10.gl_vertex_array); gl.glvertexpointer(3, GL10.GL_FLOAT, 0, vertexbuffer); gl.gldrawarrays(gl10.gl_triangles, 0, 3); gl.gldisableclientstate(gl10.gl_vertex_array); Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 15

Hello World 3D the result amazing? Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 16

Add Motion and Interaction Motion private long milsecperrotation=5*1000; private double angle=0.0f; private long lasttime;... // create an automatic rotation long time = System.currentTimeMillis(); long deltatime = time - lasttime; lasttime = time; angle = (float) (angle + 360.0 / milsecperrotation * deltatime); gl.glrotatef((float) angle, 0.0f, 1.0f, 0.0f); gl.glcolor4f(1.0f, 0.0f, 0.0f, 0.0f);... Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 17

Add Motion and Interaction Interaction Random ran = new Random();... @Override public boolean ontouchevent(motionevent event) { switch (event.getaction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: ourrenderer.r=ran.nextfloat(); ourrenderer.g=ran.nextfloat(); ourrenderer.b=ran.nextfloat(); break; } return true; }... Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 18

Add freaky Viewing adults only Introduce: virtual trackball viewing concept (pretty cool but freaking massive mathematics quaternions ) in combination with sophisticated touch handling and options menu to drastically uprade your viewing experience (roll, zoom, pan)! Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 19

Highly-skilled construction worker building higher primitives gldrawarrays (int mode, int first, int count) reads vertex data from the enabled arrays by marching straight through the array without skipping or hopping because gldrawarrays() does not allows hopping around the arrays, you still have to repeat the shared information once per face gldrawelements (int mode, int count, int type, Buffer indices) draws a sequence of primitives by hopping around arrays with the associated array indices reduces both the number of function calls and the number of information to transfer makes reuse of information by OpenGL caching possible Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 20

Highly-skilled construction worker - front FloatBuffer frontvertexbuffer; v4 v5 // front side, two triangles, without // individual color // drawarrays v0 y v1 float geometryfront[] = { -0.5f, 0.5f, 0.5f, // v0 v6 x -0.5f, -0.5f, 0.5f, // v2 0.5f, 0.5f, 0.5f, // v1 z v7 0.5f, 0.5f, 0.5f, // v1-0.5f, -0.5f, 0.5f, // v2 v2 0.5f, -0.5f, 0.5f };// v3 v3 ByteBuffer frontvertexbb = ByteBuffer.allocateDirect(geometryFront.length*4); frontvertexbb.order(byteorder.nativeorder()); frontvertexbuffer = frontvertexbb.asfloatbuffer(); frontvertexbuffer.put(geometryfront); frontvertexbuffer.position(0); Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 21

Highly-skilled construction worker - front v4 v5 v0 y v1 v6 x z v7 v2 // draw front side gl.glcolor4f(1.0f, 0.0f, 0.0f, 0.0f); gl.glenableclientstate(gl10.gl_vertex_array); gl.glvertexpointer(3, GL10.GL_FLOAT, 0, frontvertexbuffer); gl.gldrawarrays(gl10.gl_triangles, 0, 6); gl.gldisableclientstate(gl10.gl_vertex_array); v3 Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 22

Highly-skilled construction worker - right FloatBuffer rightvertexbuffer; v4 v5 // right side, two triangles, with // individual vertex color // drawarrays v0 y v1 float geometryright[] = { 0.5f, 0.5f, 0.5f, // v1 v6 x 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f, // v3 // v5 z v7 0.5f, -0.5f, 0.5f, // v3 0.5f, -0.5f, -0.5f, // v7 v2 0.5f, 0.5f, -0.5f }; // v5 v3 ByteBuffer rightvertexbb = ByteBuffer.allocateDirect(geometryRight.length*4); rightvertexbb.order(byteorder.nativeorder()); rightvertexbuffer = rightvertexbb.asfloatbuffer(); rightvertexbuffer.put(geometryright); rightvertexbuffer.position(0); Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 23

Highly-skilled construction worker - right FloatBuffer rightcolorbuffer; v4 v5 float colorright[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // v1 // v3 v0 y v1 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // v5 // v3 v6 x 1.0f, 1.0f, 1.0f, 0.0f, // v7 0.0f, 0.0f, 1.0f, 0.0f }; // v5 z v7 v2 ByteBuffer rightcolorbb = ByteBuffer.allocateDirect(colorRight.length * 4); rightcolorbb.order(byteorder.nativeorder()); rightcolorbuffer = rightcolorbb.asfloatbuffer(); rightcolorbuffer.put(colorright); rightcolorbuffer.position(0); v3 Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 24

Highly-skilled construction worker - right v4 v5 v0 y v1 v6 x z v7 // draw right side gl.glenableclientstate(gl10.gl_vertex_array); gl.glenableclientstate(gl10.gl_color_array); gl.glvertexpointer(3, GL10.GL_FLOAT, 0, rightvertexbuffer); gl.glcolorpointer(4, GL10.GL_FLOAT, 0, rightcolorbuffer); gl.gldrawarrays(gl10.gl_triangles, 0, 6); gl.gldisableclientstate(gl10.gl_color_array); gl.gldisableclientstate(gl10.gl_vertex_array); v2 v3 Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 25

Highly-skilled construction worker - top // top side, two triangles, with individual // vertex color v4 v5 // drawelements using topology float geometrytop[] = { -0.5f, 0.5f, -0.5f, // v4 v0 y v1 0.5f, 0.5f, -0.5f, // v5-0.5f, 0.5f, 0.5f, // v0 v6 x 0.5f, 0.5f, 0.5f }; // v1 z v7 float colortop[] = { 0.0f, 0.0f, 1.0f, 0.0f, // v4 1.0f, 1.0f, 1.0f, 0.0f, // v5 1.0f, 0.0f, 0.0f, 0.0f, // v0 0.0f, 1.0f, 0.0f, 0.0f};// v1 v2 v3 short topologytop[] = { 2, 3, 0, // v0, v1, v4 3, 1, 0};// v1, v5, v4 Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 26

Highly-skilled construction worker - top ByteBuffer topvertexbb = ByteBuffer.allocateDirect(geometryTop.length*4); topvertexbb.order(byteorder.nativeorder()); topvertexbuffer = topvertexbb.asfloatbuffer(); topvertexbuffer.put(geometrytop); topvertexbuffer.position(0); ByteBuffer topcolorbb = ByteBuffer.allocateDirect(colorTop.length * 4); topcolorbb.order(byteorder.nativeorder()); topcolorbuffer = topcolorbb.asfloatbuffer(); topcolorbuffer.put(colortop); topcolorbuffer.position(0); ByteBuffer toptopologybb = ByteBuffer.allocateDirect(topologyTop.length*2); toptopologybb.order(byteorder.nativeorder()); toptopologybuffer = toptopologybb.asshortbuffer(); toptopologybuffer.put(topologytop); toptopologybuffer.position(0); Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 27 v0 v2 v4 v6 z y v1 v3 x v5 v7

Highly-skilled construction worker - top v4 v5 v0 y v1 v6 x z v7 // draw top side gl.glenableclientstate(gl10.gl_vertex_array); gl.glenableclientstate(gl10.gl_color_array); gl.glvertexpointer(3, GL10.GL_FLOAT, 0, topvertexbuffer); gl.glcolorpointer(4, GL10.GL_FLOAT, 0, topcolorbuffer); gl.gldrawelements(gl10.gl_triangles, toptopologybuffer.limit(), GL10.GL_UNSIGNED_SHORT, toptopologybuffer); gl.gldisableclientstate(gl10.gl_color_array); gl.gldisableclientstate(gl10.gl_vertex_array); Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 28 v2 v3

Highly-skilled construction worker - result v4 v5 v0 y v1 v6 x z v7 v2 v3 Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 29

Distinguished architect modular design principle Use higher primitives and matrix arithmetic for modelling! Cube(float size) Cylinder(float baseradius, float topradius, float height, int stacks, int slices, boolean basecap, boolean topcap) Disk(float innerradius, float outerradius, int stacks) Sphere(float newradius, int slices, int stacks) Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 30

Distinguished architect - ingredients Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 31

Lesson learned: The fun isn t over yet! The suprises of the ANDROID API get even bigger with 3D! THANK YOU FOR YOUR ATTENTION! Graphical Apps - The Android View: Prof. Dr. Bender, Prof. Dr. Tronnier 32