Adding Open Source 3D Physics to Your iOS Applications
Many games and movies employ realistic simulation of physical interaction between virtual objects. People have an intuitive sense of expected physical behavior. It's sometimes acceptable for cartoon characters to hover in air before falling to certain doom, but bogus physics spoil the sense of immersion in otherwise realistic scenes.
Two-dimensional (2D) games such as the wildly popular Angry Birds franchise apply convincing physics to reinforce the players' sense of direct interaction with a virtual world. Watching boxes and glass blocks tumble, fall, bounce off each other, and break provides much of the entertainment. Angry Birds adapts the open source Box2d physics engine to create the convincing illusion.
A physics engine is a library of tested code suitable for use in a variety of applications. (Apple uses the term framework to describe similar collections of reusable code packaged with related resources.) Accurately simulating interactions between physical objects, collisions, forces, and accelerations can be challenging, and requires special expertise. Fortunately, existing open source code provides a nearly ideal solution.
This tutorial takes a step beyond 2D physics to explore realistic 3D physics simulation for iOS applications. The open source Bullet physics engine is published under the liberal zlib license, enabling no cost reuse in any application. The engine includes advanced features and has been adopted by countless applications including games such as Disney's Cars 2 and Riptide GP for Android. This article describes a simple iOS application incorporating Bullet and Apple's GLKit framework for 3D graphics. Links to this tutorial's source code are available at the end of this article.
Bullet is primarily implemented with the C++ programming language. It was not specifically created for use with iOS, but it's straightforward to re-host it to iOS. The first step is to download Bullet source code, bullet-2.80-rev2531.tgz. Be sure to get the version with "Unix line endings."
Once the download completes, double-click bullet-2.80-rev2531.tgz in Finder and move the resulting bullet-2.80-rev2531 folder to a file system location where you store source code. Note: Due to the open source tool chain used by Bullet, it's inconvenient to move the code once you start adding your own.
Next, download the free Cmake application. Get the version labeled "Mac OSX 64/32-bit Universal (for Intel, Snow Leopard/10.6 or later)". Cmake is an application similar to the command-line "configure" tool used by many open source projects. Uncompress Cmake, and run the application. Figure 1 shows Cmake configured, assuming the Bullet source code folder is on the desktop.
Figure 1 The Cmake application
In Cmake, press the button labeled Configure. A window shown in Figure 2 appears. Make sure you select the Xcode option.
Figure 2 Cmake's Configure window with Xcode selected
When you press Done, Cmake churns for a moment generating numerous output messages about header files and utilities found in Mac OS X. When configuration completes, Cmake displays a window similar to the one depicted in Figure 3.
Figure 3 Cmake's output after generating configuration information for Mac OS X
You should see a lot of red text in the table of configuration options. In this case, red is good. It's caused by the USE_GLUT option shown in Figure 4. It's harmless to leave it checked because Cmake does the right thing when it detects that Mac OS X doesn't provide the needed library. Unfortunately, Cmake generates an incomplete Xcode project if USE_GLUT is not checked.
Figure 4 Cmake's USE_GLUT option must be checked even though unsupported on Mac OS X
Finally, press Cmake's Generate button located right next to the Configure button. An Xcode project file is produced almost instantaneously. Cmake is no longer needed. Everything from now on will be managed within Xcode.
Double-click the BULLET_PHYSICS.xcodeproj generated within the bullet-2.80-rev2531 folder. Xcode should include 61 targets as shown in Figure 5. Select the AppAllBulletDemos target and press Run.
Figure 5 Xcode with the BULLET_PHYSICS.xcodeproj loaded and the AppAllBulletDemos target selected
Xcode compiles hundreds of files included with Bullet, and produces a Mac OS X demonstration application showing most of Bullet's major features. Experiment with the demo to get a sense of Bullet's capabilities. Figure 6 contains a screen shot of AppAllBulletDemos.app showing the SoftBody Pressure test.
Figure 6 The AppAllBulletDemos application