CHAPTER 1

image

Introduction to Physics Programming

You’ve picked up this book because you are interested in implementing physics in your programming projects. But why would you want to do that? What can it do for you? And how difficult will it be? This chapter will provide answers to these questions.

Topics covered in this chapter include the following:

  • Why model real physics? This section will explain some of the reasons why you might want to add physics to your projects.
  • What is physics? Here we lift the veil of mystery and explain in simple terms what physics is. We also tell you, in a nutshell, what you’ll need to know before you can write code involving physics.
  • Programming physics. Thankfully, programming physics is not as difficult as you might imagine, once you understand some basic principles. This section explains what you’ll need to do.
  • A simple example. As a concrete example, we’ll code up a simple animation involving physics, using a minimum of code.

Why model real physics?

There are a number of reasons why you might be interested in modeling physics using JavaScript. Here are some of the most common:

  • To create realistic animation effects
  • To create realistic games
  • To build simulations and models
  • To generate art from code

Let us look at each in turn.

Creating realistic animation effects

Thanks to the HTML5 canvas element, it is now possible to create animations without the need for plug-ins such as Flash. With a little JavaScript and some familiarity with physics, it is also possible to make animations that look and behave like the real thing. For example, suppose you are animating a scene in which someone kicks a ball and it bounces off the ground. You could try to create an animation that mimics the ball’s behavior, but however hard you might try, it would probably look less than realistic. With just a little bit of coding and some knowledge of elementary physics, you could produce a far more realistic animation. And if, like the authors, you are programmers rather than designers, you might even find it easier! We’ll show you just how easy it can be in the example at the end of this chapter.

Creating realistic games

Web-based games are extremely popular. As the capabilities of modern web browsers continue to improve, better and more powerful games can be built. Hardware acceleration and 3D support are just two of the emerging developments that have the potential to improve the online gaming user experience dramatically. But apart from performance and appearance, it is equally important for games to feel and look realistic. If a player throws a ball, it should fall according to the law of gravity; if a player fires a torpedo underwater, it should move differently from a ball falling in air. In other words, your game needs to incorporate real physics.

How do you build physics awareness into your games? This book will show you how.

Building simulations and models

A computer simulation or computer model is a program that attempts to imitate certain key aspects of a physical system. Simulations vary in completeness or accuracy, depending on purpose and resources. Let’s take a flight simulator program as an example. We would expect a flight simulator designed for training pilots to be much more comprehensive and accurate than one designed for a game. Simulations are extremely common in e-learning, training, and scientific research. In the final chapter of this book, you’ll build simulations—namely a submarine, a basic flight simulator, and a model of the solar system. In fact, many of the coded examples throughout the book are simulations, even if generally simpler.

Generating art from code

Generative art has gained popularity in recent years. A lot of fun can be had with some basic physics—for example, elaborate visual effects and motions can be produced using particles (small graphic objects that you can create and animate with code) and different kinds of forces. These effects can include realistic-looking animation such as smoke and fire, as well as more abstract examples of generative art that can be created using a mixture of algorithms, randomness, and user interaction. Adding some physics in the mix can result in enhanced realism and/or richer effects.

We will explore the world of generative art and provide additional tools and algorithms that can be used to create original and interesting effects such as particle trajectories in complex force fields.

What is physics?

Physics is the most fundamental of the sciences. In a broad sense, physics is the study of the natural laws that govern how things behave. More specifically, it concerns itself with space, time, and matter (defined as any “stuff” that exists in space and time). One aspect of physics is to formulate general laws that govern the behavior of matter, its interactions, and its motion in space and time. Another aspect is to use these laws to predict the way specific things move and interact—for example, the prediction of eclipses from the laws of gravity or how airplanes are able to fly from the laws of aerodynamics.

Physics is a vast subject, and in a book of this nature we cannot do more than scratch the surface. Fortunately, most of the physics that you will probably need to know falls within a branch known as mechanics, which is one of the easiest to understand. Mechanics governs the way in which objects move and how that motion is influenced by effects in the environment. Because most games and animations include motion, mechanics is clearly of relevance in developing algorithms for making objects behave realistically in code.

Everything behaves according to the laws of physics

Without getting too philosophical, it is fair to say that the laws of physics are truly universal, as far as physicists have been able to observe. What this means is that everything must behave according to physics. This is different from say, the laws of biology, which pertain only to living things. A stone thrown in the air, a planet orbiting the Sun, the workings of the human body, and the operation and motion of a man-made machine must all obey the laws of physics. Moreover, many seemingly diverse phenomena are governed by the same subset of laws. In other words, a single law or group of laws can explain many types of observed facts or patterns of behavior in the physical world. For example, a falling stone and a planet orbiting the Sun both obey the laws of gravity. Another example is that all electrical, magnetic, and radiation phenomena (such as light and radio waves) are governed by the laws of electromagnetism.

The laws can be written as math equations

The great thing is that the laws of physics can be written as mathematical equations. Okay, that may not sound too great if you don’t like math! But the point here is that for a law to be useful, it has to be made precise. And math equations are as precise as anything can be. There is no possible ambiguity in how to apply a law that is expressed mathematically, in contrast with the laws that are fought over in courtrooms! Second, this means that centuries of developments in mathematics prove to be applicable to physics, making it possible to solve many physics problems. Third, and what is of most relevance for us: math equations are readily convertible into code.

Predicting motion

Let’s get more specific. As a JavaScript programmer, you are mostly interested in how things move. Much of physics deals with how things move under the action of different types of influences. These “influences” can be from other things and from the environment. Examples include gravity, friction, and air resistance. In physics we have a special name for these influences: they are called forces. The really good news is that the forces have precise mathematical forms. Although the motion of objects is usually complicated, the underlying mathematical laws that describe the forces are usually quite simple.

The general relationship between force and motion can be written symbolically as follows:

motion = function{forces}

Here the use of the word function is not intended to represent an actual code function. Rather, it is meant to emphasize two things. First, it signifies a cause-and-effect relationship. Forces cause objects to move in different ways. Second, it also points to an algorithmic relationship between forces and motion in code, in that the motion of an object can be seen as the output of a function with forces as input. In practical terms, it means this: specify the forces acting on an object and put them in a mathematical equation, and then you can calculate the motion of the object.

image Note  Motion is effect. Force is cause. The motion of an object is the result of the forces acting on it. The mathematical relationship between force and motion is known as the “Law of Motion.”

To be able to put the principle stated in this note to use, you need to know the following:

  • Definitions. The precise definitions of motion and force.
  • The law of motion. In other words, the precise mathematical form of the function that relates a force to the motion it produces.
  • Force laws. In other words, how to calculate the forces. There are equations that tell you how to calculate each type of force.

So there are two kinds of laws you need to know about: laws of motion and force laws. You will also need to know the proper concepts (known as physical quantities) to describe and analyze motion and forces and the relationship between them. Finally, you will need to know the mathematics for manipulating and combining these quantities. We’ll cover the relevant math in Chapter 3, the basic physics concepts in Chapter 4, the laws of motion in Chapter 5, and the force laws for various types of forces in Chapters 610.

Programming physics

So, how do you code physics? Do you program the motion, or the forces, or both? And what does it involve?

Once you know some basic physics (and some relevant math), coding it is not much different or more difficult than what you are used to as a programmer, provided you do it in the right way. Let’s take some time to explain what this “right way” is by describing what is involved in simulating real physics and how it is done through steps involving math equations, algorithms, and code.

The difference between animation and simulation

Some wise guy once said “A picture is worth a thousand words” or something like that. One could extend this by saying “A movie is worth a thousand pictures.” A movie (or animation) adds so much more to our perception than a static image because it includes the element of change in time, an extra dimension. But there is a sense in which an animation is still static rather than dynamic. No matter how many times you play it, the animation has the same beginning and the same end. Everything happens in exactly the same way. While we might see a progression in capturing the real world from written words to visual images to animated movies, there is still something missing: the power to interact with the medium and to influence the outcome in a way that duplicates the behavior of things in real life. This next step is what we call simulation. As we use the word in this book, simulation entails realism and also interactivity. When you simulate something, you don’t just depict how it behaves under one set of conditions; you allow for many, even infinitely many, conditions. Building interactive simulations including physics makes things behave as they do in the real world: interacting with the environment and with the user to produce diverse and complex outcomes.

There is more. If you really pay attention to accuracy, you can even build a simulation that is so realistic it can be used as a virtual lab. You’ll be able to experiment with it to learn how things actually work out there in the real world, on your computer! In fact, you will build such simulations in this book.

The laws of physics are simple equations

We have already said that the laws of physics are mathematical equations. The good news is that most of the laws (and hence the equations) you’ll come across are actually quite simple. The apparently bad news is that these laws can produce very complex motions. In fact, that is probably a good thing, too; otherwise the universe would have been a rather boring place.

For example, the laws that govern gravity can be written down as just two simple-looking equations (they are given in Chapter 6). But they are responsible for the motion of the Moon around the Earth, the motion of planets around the Sun, and the motion of stars in a galaxy. The net effect of all these motions, plus the gravitational interactions between different celestial bodies, is to create very complicated motions that arise from just two equations.

Equations can be readily coded up!

We are now in a position to answer the first two questions asked at the beginning of this section. The laws of motion and forces are simple; the actual motions they produce are complex. If you know the laws, you can calculate the motions under different conditions. Hence, it makes much more sense to code the laws and forces, rather than the motions that result from them.

Animation attempts to reproduce the motion of an object directly. Simulation programs the laws of motion and then derives the motion of the object. It is much easier to code up the cause of motion than its effect. Moreover, an animation generally depicts a single scenario. But a simulation can potentially handle an infinite number of different scenarios.

image Note  Simple laws of motion and simple force laws can give rise to complex motions. It is therefore generally easier to code the laws rather than the motions. Hence, paradoxically, simulation can be easier than animation.

Simulation is like playing God. You re-create a virtual world, not by blindly duplicating all the behavior you see, but by reproducing the laws that govern the way things behave and then letting it all happen.

The four steps for programming physics

To answer the third question we asked at the beginning of this section, the process of programming physics can be broken down into four steps, as shown schematically in Figure 1-1.

9781430263371_Fig01-01.jpg

Figure 1-1. Steps in programming physics

The first step is to identify the physics principles that apply to the situation you are modeling. This can be tricky if you have no physics background. This book will help you: it is not just a how-to book but is also intended to teach you some physics. The second step is to recall, research, or derive the relevant equations. Obviously, this step involves some math. Don’t worry; we’ll give you all the help you need! The third step is to develop algorithms to solve the equations. Sometimes the equations can be solved analytically (we’ll explain what that means in later chapters), in which case the algorithms are pretty straightforward. More often, one needs to employ numerical methods, which can be simple or less so, depending on the problem and on the desired level of accuracy. Although the first two steps may seem obvious, the third step is often overlooked. Indeed, many developers may even be unaware of its existence or necessity. Again, we’ll spend some time on this aspect, especially in Part IV of the book. The fourth and last step is to write the code in your favorite programming language. You are already good at this, aren’t you?

A simple physics simulation example

To see how the process depicted in Figure 1-1 works in practice, we will now look at a simple example. We’ll set ourselves the task of simulating the motion of a ball thrown to the ground, using just a few lines of code.

To start with, let’s picture the scenario that we are trying to model, the way it behaves in reality. Suppose you throw a volleyball in the air. How does it move? You’ve probably noticed that such a ball does not move in a straight line, but traces out a curved path. Moreover, the ball appears to move slowly at the top of the curve and quickly at the bottom, near the ground. When it hits the ground it usually bounces, but always reaches a lesser height than that from which it fell. Before we try to reproduce this motion, let us look more closely at the physics causing it.

The physics of a bouncing ball

As you already know by now, forces are what cause things to move. So the first clue to understanding why the volleyball moves the way it does is to find out what forces are acting on it. As you’ll learn later, there are generally many forces acting together on objects in everyday situations. But in this case there is one force that is much more important than any other. It’s the force of gravity that the Earth exerts on the ball.

So let us assume that gravity is the only force acting on the ball once it has been thrown in the air. Thankfully, gravity acts in a straightforward way. Close to the Earth’s surface, as in the present example, it is a constant force that points vertically downward. Its effect is therefore to pull objects downward, making them accelerate as they do so. Accelerate? Yes, that means it increases the speed of the object. As we’ll discuss in much greater detail in later chapters, gravity increases the vertical speed of an object by a constant amount in each second. But because gravity acts downward, it does not affect the horizontal speed of an object.

Every time the ball hits the ground, the latter exerts a contact force on it (a contact force is a force that two solid objects exert on each other when in direct contact). This force acts upward for a very brief time. Unlike gravity, it is not easy to model this contact force directly. Therefore, we’ll simplify things and model its effect instead. Its effect is to reverse the motion of the ball from downward to upward while reducing the speed of the ball.

Coding up a bouncing ball in 2D

To simplify the scenario and the resulting code, we’ll pretend we’re living in a 2D world. An object in 2D can move along two independent directions: horizontal and vertical. We’ll denote the position of the ball at any given time by two numbers, x and y, where x refers to the horizontal position, and y refers to the vertical position. We’ll denote the speed at which the ball is moving along these two directions as vx and vy.

According to what we said, each time the clock ticks, gravity will cause vy to increase by a constant amount, but vx will remain the same.

Because vx and vy are speeds, they tell us how much the object moves each time the clock ticks. In other words, at each tick of the clock, x increases by an amount vx, and y increases by an amount vy.

This implements the effect of gravity. To implement the effect of the ground, what we have to do is reverse the sign of vy and reduce its magnitude each time the ball hits the ground. And, believe it or not, that’s pretty much it.

Some code at last!

The JavaScript code for the example depicted in Figure 1-2 is included in the bouncing-ball.js file, which may be downloaded together with all other source code in the book at apress.com.

9781430263371_Fig01-02.jpg

Figure 1-2. The bouncing ball created by this example

Here is the code that does it all:

var canvas = document.getElementById('canvas'),
var context = canvas.getContext('2d'),
var radius = 20;
var color = "#0000ff";
var g = 0.1; // acceleration due to gravity
var x = 50;  // initial horizontal position
var y = 50;  // initial vertical position
var vx = 2;  // initial horizontal speed
var vy = 0;  // initial vertical speed

window.onload = init;

function init() {
     setInterval(onEachStep, 1000/60); // 60 fps
};
function onEachStep() {
     vy += g; // gravity increases the vertical speed
     x += vx; // horizontal speed increases horizontal position
     y += vy; // vertical speed increases vertical position
     if (y > canvas.height - radius){ // if ball hits the ground
          y = canvas.height - radius; // reposition it at the ground
          vy *= -0.8; // then reverse and reduce its vertical speed
     }
     if (x > canvas.width + radius){ // if ball goes beyond canvas
          x = -radius; // wrap it around
     }
     drawBall(); // draw the ball
};
function drawBall() {
     with (context){
          clearRect(0, 0, canvas.width, canvas.height);
          fillStyle = color;
          beginPath();
          arc(x, y, radius, 0, 2*Math.PI, true);
          closePath();
          fill();
     };
};

We’ll explain fully in the next chapter all the elements of the JavaScript code as well as the HTML5 markup in which it is embedded. The important lines that contain the physics are those with the comments next to them. The variable g is the acceleration due to gravity. Here we’ve set a value that will give an animation that looks visually correct. The next lines set the initial horizontal and vertical position and speeds of the ball. All the physics action is taking place in the aptly named function onEachTimestep(), which is executed at the frame rate set for the movie. Here we increase vy but not vx because gravity only acts vertically. Then we update the ball’s position by increasing x and y by amounts vx and vy, respectively. The subsequent pieces of code take care of the bouncing, and recycle the ball if it leaves the canvas. The ball is erased and redrawn at each time step by the function drawBall(), the innards of which will become clear in the next chapter, together with the rest of the code.

Run the code and see the result. It looks pretty realistic, doesn’t it? How does the ball know how to behave with so few instructions? This is like magic. We challenge you to create the same effect without physics!

Is it really that easy? Wait! We’ve barely scratched the surface of what’s possible. There are plenty of ways to improve the simulation to make it even more realistic, but they require more physics and more coding. For example, you could add friction so that the ball’s horizontal speed reduces as it moves along the ground. Suppose you are building a game that includes balls moving around. You might want the ball to feel the effect of air resistance and to be blown by wind in addition to moving under the effect of gravity. You might want it to behave properly if thrown into water, sinking and then rising, and oscillating on the water surface before coming to rest and floating. There might be lots of balls colliding. Or you might want to create an accurate simulation that school students can use to learn about gravity. In that case, you would need to pay careful attention to implement proper boundary effects as well as accurate and stable time-stepping algorithms. By the time you finish the book, you will be able to do all these and more. And you’ll know what you are doing. We promise.

Summary

Physics encapsulates the laws of nature in mathematical form. These laws are simple and can be readily coded. Hence, it is generally easy to create effects that look realistic.

Programming physics involves four steps: identifying what physics principles you need, writing down the relevant equations, devising a numerical algorithm for solving the equations, and writing the code. So it involves knowledge and skills in four different areas: physics, math, numerical methods, and programming. This book gives you help in the first three areas; you are assumed to have some proficiency in the fourth: general programming in JavaScript.

Having said this, the next chapter will provide a rapid overview of selected topics in JavaScript and HTML5, emphasizing aspects that are especially relevant for physics programming.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.218.8.147