Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Java ME - 08 - Mobile 3D Graphics

6.362 visualizaciones

Publicado el

Nearly all of today's PC and console games use 3D graphics. With mobile phones getting more and more powerful and some devices even boasting a hardware 3D acceleration, development using three-dimensional graphics is an important topic for mobile computing. This module covers the JSR 184 (Mobile 3D Graphics) and explores the possibilities offered by its retained mode (high level) API for defining a scene graph and modifying objects in the world. A detailed example walks you through the basics of the free, open source 3D package Blender. Using this powerful software, you can create a sample 3D scene that you can display on your mobile phone with just a few lines of code. The challenge is about extending a sample 3D game framework, featuring an exciting car racing game!


* Mobile 3D - Overview
* JSR 184 (m3g)
* Scene graph
* Your first m3g file with Blender
* Display, load and modify the 3D scene
* Objects and materials
* Challenge: 3D car racing game

  • Hi there! Get Your Professional Job-Winning Resume Here - Check our website!
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí
  • Mobile 3D Graphic
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí

Java ME - 08 - Mobile 3D Graphics

  1. 1. Java™ Platform, Micro Edition<br />Part 8 – Mobile 3D Graphics<br />v3.0a – 18 April 2009<br />1<br />Andreas Jakl, 2009<br />
  2. 2. Disclaimer<br />These slides are provided free of charge at and are used during Java ME courses at the University of Applied Sciences in Hagenberg, Austria at the Mobile Computing department ( )<br />Respecting the copyright laws, you are allowed to use them:<br />for your own, personal, non-commercial use<br />in the academic environment<br />In all other cases (e.g. for commercial training), please contact<br />The correctness of the contents of these materials cannot be guaranteed. Andreas Jakl is not liable for incorrect information or damage that may arise from using the materials.<br />This document contains copyright materials which are proprietary to Sun or various mobile device manufacturers, including Nokia, SonyEricsson and Motorola. Sun, Sun Microsystems, the Sun Logo and the Java™ Platform, Micro Edition are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. <br />Andreas Jakl, 2009<br />2<br />
  3. 3. Agenda<br />Mobile 3D – Overview <br />JSR 184<br />Scene graph<br />Your first m3g file with Blender<br />Display, load and modify the 3D scene<br />Objects and materials<br />Andreas Jakl, 2009<br />3<br />
  4. 4. Introduction<br />Mobile 3D<br />Andreas Jakl, 2009<br />4<br />
  5. 5. 3D Java Game Examples<br />5<br />Brothers in Arms: Earned in Blood (Gameloft)<br />Planet Riders 3D (Fishlabs)<br />Massive Snowboarding 3D (Gameloft)<br />Tornado Mania! 3D (Digital Chocolate)<br />For comparison: Current C++ / Open GL ES based N-Gage games (Symbian OS)(This is what is currently possible with mid-/higher class mobile phones)<br />Blades & Magic 3D (Fishlabs)<br />Hooked On: Creatures of the Deep (Infinite Dreams)<br />Star Wars: The Force Unleashed (Universomo / LucasArts) <br />One (Digital Legends)<br />Andreas Jakl, 2009<br />
  6. 6. Benchmark Your Phone<br />FuturemarkSPMarkJava JSR 184<br />JBenchmark 3D/HD:<br />Andreas Jakl, 2009<br />6<br />
  7. 7. 3D APIs for Java ME<br />Mobile 3D Graphics API (JSR 184)<br />Java based 3D graphics library<br />Supports immediate and retained mode (low and high level)<br />Optional package<br />Open GL ES (JSR 239)<br />Provide Java bindings to the Open GL ES native 3D graphics library<br />OpenGL ES can also be used in native code (Symbian OS / C++)<br />Mascot Capsule<br />Like JSR 184, additionally supported by e.g. SonyEricsson<br />(Java 3D from Java SE is too bloated for mobile phones: ~40 MB)<br />7<br />Andreas Jakl, 2009<br />
  8. 8. 3D APIs<br />M3G builds on the feature set of OpenGL ES<br />Both APIs are designed concurrently<br />Andreas Jakl, 2009<br />8<br />Native C / C++ Applications<br />Java Applications<br />M3G (JSR 184)<br />OpenGL ES<br />Graphics Hardware<br />
  9. 9. Performance<br />Java is slow on mobile phones<br />KVM most widely used today<br />Nokia (and others) migrating to HotSpot VM from Sun<br />But HotSpot takes a lot of RAM  problematic in real life<br />9<br />Andreas Jakl, 2009<br />Benchmarked on an ARM926EJ-S processor with hand-optimized Java and assembly code<br />Diagram from TomiAarnio (see sources slide at the end)<br />
  10. 10. The Basics of JSR 184<br />Get started<br />Andreas Jakl, 2009<br />10<br />
  11. 11. JSR 184<br />Hardware independent<br />Uses newer hardware + 3D accelerators if present<br />Separate code from content<br />m3g file format contains models, animation, appearance, textures, ...<br />Control logic in source code<br />Tightly integrated with LCDUI (from MIDP, requires floating point support of CLDC 1.1+)<br />Built in high level & low level API<br />Scene graphs, keyframe animation, bones, ...<br />11<br />Andreas Jakl, 2009<br />
  12. 12. Modes<br />Immediate Mode<br />Create objects programmatically<br />Uses triangles as primitives<br />Low level<br />Retained mode<br />Create objects in 3D app<br />Scene graphs<br />Keeps graphics processing code in native code (no Java)!<br />Mixing is possible<br />(e.g. insert immediate object into a scene graph)<br />12<br />Andreas Jakl, 2009<br />
  13. 13. Tools<br />Blender (Freeware,<br />m3g exporter plug-in:<br />Blender: Powerful, but difficult to learn UI<br />Written in Python<br />Commercial<br />3DS Max (integrated)<br />Maya<br />Lightwave<br />13<br />Andreas Jakl, 2009<br />
  14. 14. JSR 184 – Synchronous Structure<br />All APIs are synchronous<br />Calls return when completed<br />Create own thread for loading larger scenes!<br />Structure<br />No callbacks (interfaces, events, abstract methods)<br />Do not override any methods<br />14<br />Andreas Jakl, 2009<br />
  15. 15. m3g File Format<br />Compact binary format<br />Stores complete scene graph in file<br />Objects are serialized<br />Includes camera(s), lightning and objects<br />Can be compressed<br />Viewer:<br />15<br />Andreas Jakl, 2009<br />
  16. 16. Scene Graph<br />Andreas Jakl, 2009<br />16<br />World is a top-level node containing the whole scene<br />Background defines the background against which the 3D scene is rendered<br />World<br />Background<br />Groups allow the application to treat multiple nodes as a single unit<br />Group<br />Camera<br />Light<br />Groups can be nested inside other groups<br />Sprite3D is a 2D image with a 3D position<br />Light defines a light source in the scene<br />Camera defines a viewpoint<br />Sprite3D<br />Group<br />Group<br />Mesh<br />User object<br />Mesh defines the 3D geometry of a visible object<br />An arbitrary user object can be associated with any scene object<br />MorphingMesh<br />SkinnedMesh<br />Morphing and skinned meshes are animated geometry objects<br />Based on the scene graph image from the JSR 184 API documentation<br />
  17. 17. Graph vs. Tree<br />Scene graph has a tree structure<br />Node can belong to at most one group at a time<br />But components (VertexArrays, textures, ...) can be shared<br />No cyclic structures allowed<br />Andreas Jakl, 2009<br />17<br />Node<br />Node<br />Component<br />Group<br />Group<br />Component<br />Node<br />
  18. 18. Scene Graph – Example <br />Andreas Jakl, 2009<br />18<br />World root node<br />Camera and light<br />The car<br />The landscape scene group<br />Tree<br />The tree consists of two meshes<br />The tree has no texture image<br />Grass block<br />Grass texture<br />
  19. 19. Node<br />Abstract base class for all scene graph nodes<br />Contains information about:<br />Transformation<br />Parent<br />Alignment (also automatic!)<br />Visibility<br />...<br />Andreas Jakl, 2009<br />19<br />Node<br />Camera<br />Light<br />Group<br />Mesh<br />Sprite3D<br />World<br />
  20. 20. Key Classes<br />3D graphics context<br />Handles all rendering<br />Graphics3D<br />Utility to load m3g and png files<br />(entire scene graphs or single objects)<br />Loader<br />Root node of the scene graph<br />World<br />20<br />Andreas Jakl, 2009<br />
  21. 21. Graphics3D<br />Stores global state<br />Rendering target, viewport, depth buffer, back buffer<br />Camera, light sources<br />Rendering quality hints (Antialiasing, dithering, true color rendering)<br />Each node has its own local state<br />Geometry & appearance (material, textures, ...)<br />Transformation relative to the parent or world<br />21<br />Andreas Jakl, 2009<br />Graphics3D<br />
  22. 22. Graphics3D – Rendering Modes<br />Retained mode<br />Render entire world (scenegraph)<br />Uses lights and camera nodes from the world<br />Immediate mode<br />Render scene graph nodes or submesh<br />Uses lights and camera from Graphics3D object<br />Andreas Jakl, 2009<br />22<br />
  23. 23. Graphics3D – Render Targets<br />Graphics3D can render to any Graphics object or Image2D<br />  possible to render to textures (eg. environment mapping)<br />Andreas Jakl, 2009<br />23<br />World<br />M3G(JSR 184)<br />Graphics3D<br />Image2D<br />Graphics<br />Canvas<br />Image<br />MIDP<br />CustomItem<br />
  24. 24. Graphics3D – Example <br />Target has to be bound and released<br />Do not modify the target from the outside in between<br />Andreas Jakl, 2009<br />24<br />publicclassMyCanvasextendsCanvas<br />{<br />Graphics3D myG3D = Graphics3D.getInstance();<br /> <br />publicvoidpaint(Graphics g) {<br />try {<br /> myG3D.bindTarget(g);<br />// ... update thescene ...<br />// ... render thescene ...<br /> } finally {<br /> myG3D.releaseTarget();<br /> }<br />}<br />
  25. 25. World Node<br />Top level node for a scene graph<br />Contains<br />Other nodes that compose the scene<br />Background<br />Camera, Light, Fog<br />Requires an active camera for rendering<br />Andreas Jakl, 2009<br />25<br />World<br />
  26. 26. Example – Goal <br />Create an m3g file with Blender<br />Load and display the file in a MIDlet<br />Rotate the object<br />Andreas Jakl, 2009<br />26<br />
  27. 27. Blender<br />The basics of<br />Andreas Jakl, 2009<br />27<br />
  28. 28. Blender – Interface<br />Andreas Jakl, 2009<br />28<br />3D Viewport<br />Light<br />Sample Cube<br />Camera<br />Buttons Window<br />
  29. 29. Blender – Windows<br />Andreas Jakl, 2009<br />29<br />The highlighted window receiveskeyboard inputs:<br />Highlighted<br />(slightly brightercolour)<br />Change the window type:<br />... you can split, join and resize windows anddrag mini windows (with the )<br />
  30. 30. Blender – 3D Viewport<br />Andreas Jakl, 2009<br />30<br />Click + hold middle mouse button<br /> Rotate viewport<br />Shift + middle mouse button<br /> Pan view (move sideways)<br />Mouse wheel<br /> Zoom<br />Z-key<br /> Toggle wireframe or solid mode<br />NUM5 (with NUM LOCK on)<br /> Toggle Ortographic / Perspective<br />NUM0 (with NUM LOCK on)<br /> Camera view (MMB will exit it)<br />Choose viewport shading (more options than Z)<br />NUM refers to the number pad – if you pressed the numbers above the normal keys instead, press 1 to return to the normal view (for viewing layer 1)<br />
  31. 31. The 3D Cursor<br />Andreas Jakl, 2009<br />31<br />Task: place the 3D cursor between the camera and the cube<br />Make sure you are in object mode (press TAB to toggle)<br />Disable the “3d transform manipulator” to make sure you can move the cursor without selecting the cube by accident<br />Hit NUM7 to get to the top view<br />Click with LMB between cube and camera<br />Choose different view (NUM1 – front view or NUM3 – side view)<br />Click between cube and camera with LMB<br />Rotate the view to see if it was positioned correctly<br />1<br />2<br />3<br />4<br />Note: we’re working in a 3D space but only have a 2D screen – therefore you need two views to set all three coordinates of the cursor!<br />5<br />
  32. 32. Deleting and Adding Objects<br />Andreas Jakl, 2009<br />32<br />Task: replace the cube with a monkey<br />Set “Object Mode”; switch off “3d transform manipulator” (see previous slide)<br />Move the cursor to the center (Shift+CKEY)<br />RMB on the cube to select it<br />DELKEY to delete the object. Confirm in the prompt window (“Erase Selected”)<br />Use the Add menu to add a new object. Here: Add  Mesh  Monkey<br />Blender automatically switches to edit mode. Go to object mode (TAB), press CKEY to center the cursor on the screen, ZKEY to toggle solid and wireframe mode. Zoom in (Mouse wheel)<br />3<br />4<br />5<br />6<br />
  33. 33. Material<br />Andreas Jakl, 2009<br />33<br />2<br />3<br />Task: change the material of the monkey<br />Select the monkey object (RMB); set “Object Mode”<br />Press the shading button<br />In contrast to the cube, the monkey doesn’t have a default material. Click the button next to “Add New” and choose “O Material” (same that was originally on the cube)<br />In the “Material” tab, set any color you want for “Col” and “Spe” (specularcolor, for highlights)<br />Press the button with the small car in the “Links and Pipeline” tab for an automatic material name<br />Set the draw type of the 3D Viewport to “Shaded” for a more accurate preview<br />4<br />5<br />6<br />
  34. 34. IDs and m3g Export<br />Andreas Jakl, 2009<br />34<br />Task: to access the nodes from the m3g file in source code, they need IDs.<br />Set “Object Mode”<br />Select the monkey with the RMB<br />Add #01 at the end of the object name to give it the ID 1 in the m3g file<br />Do the same for the light (#02) and the camera (#03)<br />Task: export the m3g file (requires the m3g exporter plug-in)<br />File  Export  M3G<br />You can safely disable texturing<br />
  35. 35. m3g File<br />Andreas Jakl, 2009<br />35<br />Open the m3g file in the m3g viewer* and choose Display  Scene Graph View<br />Our IDs have been saved in the file<br />*<br />
  36. 36. Display the 3D scene<br />Switching to the Java side<br />Andreas Jakl, 2009<br />36<br />
  37. 37. Loading the m3g File<br />Create a simple MIDlet and Canvas-class (sample start project is provided)<br />Add the monkey.m3g to the root of the .jar<br />Init code snippetof the Canvas:<br />Object3D[] roots = null;<br />try {<br />// Load the m3g file<br /> // The loader will return all root level objects of the file,<br /> // which are not referenced by any other objects.<br /> // Always state an absolute path (&quot;/&quot;)!<br /> roots = Loader.load(&quot;/monkey.m3g&quot;);<br />} catch (IOException ex) {<br />// couldn&apos;t open the file, or invalid data in the file<br />ex.printStackTrace();<br />}<br />// Usually the world node is the only and first node.<br />// If loading unknown files, you should check it though.<br />// Save the world node to an instance variable<br />for (inti = 0; i &lt; roots.length; ++i) {<br /> if (roots[i] instanceof World) {<br />iWorld = (World) roots[i];<br /> }<br />}<br />Andreas Jakl, 2009<br />37<br />
  38. 38. Game loop in a GameCanvas<br />Andreas Jakl, 2009<br />38<br />public void run() {<br />// Get the singleton Graphics3D instance that is associated with this midlet.<br />Graphics3D g3d = Graphics3D.getInstance();<br /> // Measure the time that has passed since the prev. frame<br /> long start, elapsed = 0; int time = 0;<br /> while (iIsActive) {<br /> start = System.currentTimeMillis();<br /> try {<br />// Bind the 3D graphics context to the given MIDP Graphics object.<br />g3d.bindTarget(getGraphics());<br /> // Update the world [...]<br />iWorld.animate(time); // Animate the world<br />// Render the view from the active camera<br />g3d.render(iWorld);<br /> } finally {<br />// Release the graphics context<br />g3d.releaseTarget();<br /> }<br />flushGraphics(); // Flush the rendered image to the screen<br />// Give other threads a chance to run<br />Thread.sleep(20); // This sample omits try and catch<br /> elapsed = System.currentTimeMillis() - start;<br /> time += elapsed; // Time that has passed since the last frame<br /> }<br />}<br />
  39. 39. MIDP Relationship<br />Andreas Jakl, 2009<br />39<br />Mobile 3D<br />MIDP 2<br />binds<br />Graphics3D<br />Graphics<br />renders to<br />renders<br />renders<br />World<br />Screen<br />
  40. 40. The Camera<br />The camera was too far away in the Blender scene<br />Move it towards the object after loading the world:<br />Andreas Jakl, 2009<br />40<br />Camera cam = iWorld.getActiveCamera();<br />cam.setTranslation(-5.0f, 5.0f, -4.0f);<br />
  41. 41. Node Transformations<br />Each node: local coordinate system<br />Node transformation: from this node to the parent node (ignored for root)<br />Translation T<br />Rotation R<br />Non-uniform scale S<br />Generic matrix M<br />Composite C = TRSM<br />Andreas Jakl, 2009<br />41<br />C<br />World<br />C<br />Group<br />C<br />C<br />Sprite3D<br />Group<br />C<br />C<br />Group<br />Mesh<br />
  42. 42. Modifying Objects<br />Rotate the monkey<br />Andreas Jakl, 2009<br />42<br />private static final int ID_MONKEY = 1;<br />// Find searches through all children of this node<br />Node monkey = (Node) iWorld.find(ID_MONKEY);<br />switch (getKeyStates())<br />{<br /> case LEFT_PRESSED:<br /> // Parameters: angle, x / y / z component of<br /> // the rotation axis. Here: all on z axis<br />monkey.postRotate(5.0f, 0.0f, 0.0f, -1.0f);<br /> break;<br /> case RIGHT_PRESSED:<br />monkey.postRotate(5.0f, 0.0f, 0.0f, 1.0f);<br /> break;<br />}<br />
  43. 43. Objects and Materials<br />What is actually rendered?<br />Andreas Jakl, 2009<br />43<br />
  44. 44. Textures<br />Add visual richness<br />Backgrounds<br />Surface structure<br />Sprites for “cheating”(no complex 3D models)<br />Andreas Jakl, 2009<br />44<br />Character images copyright David Dang<br /><br />Sprites in “Doom” by id Software<br />
  45. 45. Perspective Correction<br />Perspective correction<br />Expensive, avoid if possible<br />But still better than a lot more polygons<br />Nokia: 2% fixed overhead, 20% in the worst case<br />Andreas Jakl, 2009<br />45<br />Perspective correction<br /><br />
  46. 46. Light Maps<br />Lightning<br />Use light maps instead of real light<br />Pre-calculate light for non-textured (colored) objects: vertex coloring<br />Andreas Jakl, 2009<br />46<br />light map(unfiltered)<br />light map(filtered)<br />w/o light maps<br />with light maps<br />Images from lecture slides of Stephen Chenney (see sources at the end)<br />
  47. 47. Mobile Textures II<br />Backgrounds<br />Use background images, no skybox or real 3D<br />Sprites<br />Much faster than real geometry or textured quads<br />But too much overhead for particle effects<br />Images<br />Load through Loader class (Image2D) – going through MIDP Image wastes memory<br />Andreas Jakl, 2009<br />47<br />Sprites in a 3D scene<br />Playman World Soccer (Mr.Goodliving)<br />3D Sprites can be useful for 2D games as well (rotation!)<br />Tower Bloxx (Digital Chocolate)<br />
  48. 48. IndexBuffer<br />IndexBuffer<br />Appearance<br />Appearance<br />Mesh<br />How is the object defined? (vertices, material, ...)<br />Andreas Jakl, 2009<br />48<br />Mesh<br />Vertex positions, normals, texture coordinates, ...<br />VertexBuffer<br />Defines a submesh (consisting of triangle strips) – reference data from the vertex buffer<br />IndexBuffer<br />Appearance<br />1 Appearance per submesh. Defines color, texture, ...<br />
  49. 49. Sprite3D<br />2D image with 3D position<br />Fast, but functionally restricted alternative to textured geometry<br />Scaled mode: billboards, trees, ...<br />Unscaled mode: text labels, icons, ...<br />Andreas Jakl, 2009<br />49<br />Sprite3D<br />Appearance<br />Contains compositing and fogging attributes<br />Image2D<br />
  50. 50. Animation<br />Short overview of<br />Andreas Jakl, 2009<br />50<br />
  51. 51. Animations<br />Defined in the m3g file<br />Automatically played corresponding to the time by animate() method<br />Andreas Jakl, 2009<br />51<br />Defines time within the animation, speed, weight for blending, ...<br />Animated Object (Object3D)<br />AnimationTrack<br />AnimationController<br />AnimationTrack<br />KeyframeSequence<br />Each track associates a property (e.g. position) with a controler & keyframe data.<br />Multiple tracks may be blended.<br />Values of the animated property (keyframes) + the interpolation mode.<br />KeyframeSequence<br />
  52. 52. KeyframeSequence<br />Andreas Jakl, 2009<br />52<br />KeyframeSequence<br />Keyframe: time & property value at that time<br />Sequence:<br />Can store multiple keyframes<br />Several interpolation methods<br />Can be looping<br />property value<br />sequence time<br />v<br />t<br />Diagram based on Sean Ellis, Superscape<br />
  53. 53. KeyframeSequence<br />Keyframe: time & property value at that time<br />Sequence:<br />Can store multiple keyframes<br />Several interpolation methods<br />Can be looping<br />Andreas Jakl, 2009<br />53<br />KeyframeSequence<br />property value<br />sequence time<br />Diagram based on Sean Ellis, Superscape<br />
  54. 54. KeyframeSequence<br />Keyframe: time & property value at that time<br />Sequence:<br />Can store multiple keyframes<br />Several interpolation methods<br />Can be looping<br />Andreas Jakl, 2009<br />54<br />KeyframeSequence<br />property value<br />sequence time<br />Diagram based on Sean Ellis, Superscape<br />
  55. 55. KeyframeSequence<br />Andreas Jakl, 2009<br />55<br />KeyframeSequence<br />Keyframe: time & property value at that time<br />Sequence:<br />Can store multiple keyframes<br />Several interpolation methods<br />Can be looping<br />property value<br />sequence time<br />v<br />t<br />Diagram based on Sean Ellis, Superscape<br />
  56. 56. AnimationController<br />Controls position, speed and weight of an animation sequence<br />Usually controls multiple AnimationTracks (properties) at the same time<br />Defines mapping from world time to sequence time<br />Andreas Jakl, 2009<br />56<br />AnimationController<br />world time<br />sequence time<br />0<br />s<br />d<br />t1<br />t2<br />Diagram based on Sean Ellis, Superscape<br />
  57. 57. Morphing<br />Andreas Jakl, 2009<br />57<br />Base<br />Target 1eyes closed<br />Target 2<br />mouth closed<br />Animate eyesand mouth<br />independently<br />Unfortunately, the animations are not exported to the pdf<br />Mesh<br />MorphingMesh<br />Images from Aarnio and Pulli (see sources at the end)<br />
  58. 58. Skinning<br />Andreas Jakl, 2009<br />58<br />No skinning<br />Local skinning<br />one bone per vertex<br />Smooth skinning<br />two bones per vertex<br />Unfortunately, the animations are not exported to the pdf<br />Mesh<br />SkinnedMesh<br />Images from Aarnio and Pulli (see sources at the end)<br />
  59. 59. Summary<br />M3G enables real-time 3D on mobile phones<br />Works both with software and hardware 3D<br />Supported by millions of devices<br />Mixture of low- and high level<br />Allows easy creation of scenes<br />But still gives the developer full control<br />Flexible architecture<br />Based on OpenGL ES features<br />Defines a convenient file format<br />Andreas Jakl, 2009<br />59<br />
  60. 60. Sources<br />TomiAarnio and Kari Pulli: Advanced Game Development with the Mobile 3D Graphics API. JavaOne Conference, 2004.<br />Andrew Davison: Special Topics in Info. Eng.: Introductionto J2ME Programming. Lectureslides, 2007<br />Qusay H. Mahmoud: Getting Started With the Mobile 3D Graphics API for J2ME.<br />Carol Hamer: Creating a basic M3G file with Blender.<br />David Millet, Arthur Tombs et al.: Blender 3D: Noob to Pro.<br />MikaelBaros: 3D programming tutorial for mobile devices using M3G (JSR 184).<br />Kari Pulli et al.: Developing Mobile 3D Applications With OpenGL ES and M3G. Eurographics 2006.<br />JanneHellsten: Building scalable 3D apps - Tips & tricks for developers.<br />Stephen Chenney: Computer Game Technology. Lecture slides, 2001.<br />Andreas Jakl, 2009<br />60<br />
  61. 61. Thanks for your attention<br />That’s it!<br />Andreas Jakl, 2009<br />61<br />