Digging Animation
Digging Animation

Digging Animation

by Antoine Quint
January 23, 2002

I'm pleased to welcome Antoine Quint as an XML.com columnist. Antoine will be writing monthly on SVG, bringing his distinctive French style to this exciting new technology.

In order to view the SVG examples you will need Adobe's SVG viewer installed -- ED.

Introduction

The Web has been constantly evolving since it appeared about a decade ago. The days of plain text web sites are largely gone now and, among other things, vector graphics have become an increasingly common part of web pages. SWF, better known as the format used by Macromedia Flash, has become the medium of choice for the publication of high-octane all-singing, all-dancing presentations. However, SWF has its limitations, dynamic publishing being a big one. If you are reading this column, then you have probably already heard a little bit about the emerging XML vector graphics format called SVG. Today we will start our foray into the neat world of SVG animation.

Animation is a core feature of SVG. It is a large part of SVG's specification and is based on SMIL Animation. In fact, if you know about SMIL animation already then this article ought to be a doodle or a nice little bit of review. You might want to have the SVG Animation spec chapter handy before we start. My mission in this article is to show you how to recreate one of those nifty gravity animation effects that people gaze at for hours. SVG will certainly not make this kind of animation any more useful than its implementation in Flash, but it is certainly very instructive to create. For a little taste of what we're going to create, have a look at Niklas Gustavsson's original SWF animation, although we're going to add a few enhancements. Grab your favorite text editor and we will be off!

Creating the Graphics

Niklas was kind enough to provide the actual source to his animation on his site, which is going to help us a lot in creating a similar animation in SVG. I downloaded the source, opened it in Macromedia Flash 5, selected one of the little cubes, and copied it onto the clipboard. Then I picked up my favorite SVG-enabled tool, Adobe Illustrator 10, created a new document and pasted the cube right in. This is a good point to start working with SVG, so I asked Illustrator to save the document as SVG. Here's what we've got to work with

<?xml version="1.0" encoding="iso-8859-1"?>



<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"

          "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">



<svg width="665px" height="250px" viewBox="0 0 665 250" 

     xml:space="preserve">



  <g id="cube" style="stroke: #000000; stroke-width: 0.5; 

                      stroke-linejoin: bevel">

    <path style="fill: #333333;" d="M0.112,26.271l25.032,

                      12.485V25.164L0.112,12.68V26.271z"/>

    <path style="fill: #666666" d="M25.144,38.756l25.033-

                      12.485H50.12V12.708L25.144,25.164V38.756z"/>

    <path style="fill: #cccccc" d="M50.12,12.708l0.057-

                      0.028L25.144,0.224L0.112,12.68l25.032,

                      12.484L50.12,12.708z"/>

  </g>



</svg>

[View this code as SVG]

Now what we're going to do is to take this little cube's group (enclosed in the <g> element) and transform it into an SVG symbol that we will be able to re-use as we please. This is quite simple really, just switch the group to a symbol and add it as a definition. We then place the cube to the center of the composition and add the background gray rectangle so it looks a little more like Niklas's layout. Also, we give this composition a title. Now our code looks like what appears just below. From now on we will take this as a given and never print the doctype and definitions:

<svg width="665px" height="250px" viewBox="0 0 665 250" 

     xml:space="preserve">



  <title>SVG Animation - Cube Demonstration</title>



  <defs>

    <symbol id="cube" style="stroke: #000000; stroke-width: 0.5; 

                             stroke-linejoin: bevel">

      <path style="fill: #333333;" d="M0.112,26.271l25.032,

                        12.485V25.164L0.112,12.68V26.271z"/>

      <path style="fill: #666666" d="M25.144,38.756l25.033-

                        12.485H50.12V12.708L25.144,25.164V38.756z"/>

      <path style="fill: #cccccc" d="M50.12,12.708l0.057-

                        0.028L25.144,0.224L0.112,12.68l25.032,

                        12.484L50.12,12.708z"/>

    </symbol>

  </defs>



  <rect width="100%" height="100%" 

        style="fill: #999999; stroke: none;" />



  <use xlink:href="#cube" transform="translate(307.5, 105.75)" />



</svg>

[View this code as SVG]

Starting Up Gently (And Linearly)

Now that we have the graphics ready, it is time to start with a little animation. I must warn you though: however hard you thought it would be, it will be easier! The first thing I want to show you is how to make a linear animation of the cube going up and down, up and down (and so on). We placed our symbol in the graphic using the "transform" attribute, which, although moving the symbol in the image, left the symbol's "y" coordinate attribute at its default value of "0". So if we want the animation of our object to be an offset animation, we will just change the "y" attribute for the offset and leave the "transform" alone for the original positioning:

<use xlink:href="#cube" transform="translate(307.5, 105.75)">

  <animate attributeName="y" dur="2s" 

           values="0; -45; 0; 16; 0; -7; 0; 3; 0; -2; 0; 1; 0" />

</use>

[View this code as SVG]

This is a start. What we've done here is to add an "animation" element as a child to our "use" element and set a few of its attributes which dictate its behavior. The "attributeName" attribute allows us to target which of our "use" element's attributes is going to be animated. This highlights one of the main features of SVG animation: it is property-based. This means that each of an SVG element's properties (that is, XML attributes or CSS properties) have their own, unique and independent animation environment by default. This allows for several neat things, the main one being that an element can have properties animated with different loop durations, loop count or whatever. This helps a great deal when trying to create random-looking declarative animation. If you're familiar with the Flash tool, you'll know that you need movie clips to achieve that kind of behavior, which is fairly advanced. SVG animation keeps it simple. Also, SVG animation allows us to actually create relationships for the synchronization of different animations so that time independence isn't the only way forward (more on that later).

Going back to the animation we just wrote, note that we also specified the duration of the animation. The "dur" attribute sets the duration, and here we specified that our animation lasts "2s", two seconds. This is another highlight of SVG animation: it is time-based. Once again, if you have any experience with Flash, you will have noticed that it is a frame-based tool, the timeline being graded in frame units. This means that one has to set up a particular frame rate when publishing SWF animation.

Comment on this article Comments or questions about this article? Let us know by using the forum.
Post your comments

Adobe LiveMotion (another SWF tool) offers a time-based timeline, but it still has to generate frame-based animation when exporting SWF. I believe being time-based is an SVG advantage, as it allows us to define animations evolving in a realistic unit system (time) and leaves the actual frame-rate decision to the SVG player that will probably try to make most of your CPU to render nice and smooth animations. As we go through building this example, you may realize that SVG's animation rendering model is quite different from SWF's. An SWF authoring tool will have all the frames computed at export time while SVG animation leaves much of the computation work to the SVG player. This often leads to smaller file sizes and higher computation needs from the device. Then again, animation frame computation may not be the most demanding phase of animation, as actual drawing is probably the most demanding.

But I digress. We've almost forgotten about this semicolon-separated list of mysterious values in the "values" attribute. Well, this is quite simply the list of values that will be assigned to our "attributeName", much like keyframes in Flash. By default, an SVG player will compute a linear interpolation between each value, thereby creating the animation. It will also have those value changes happen one after the other at a regular interval equal to the duration of the animation divided by the amount of values in the list minus one.

[1] [2] Next

Close    To Top
  • Prev Article-XML:
  • Next Article-XML:
  • Now: Tutorial for Web and Software Design > XML > Muitimedia > XML Content
    Photoshop Tutorial
     

    Special Effect

      3D Effect
      Photoshop Articles
    Programming Tutorial
     

    C/C++ Tutorial

      Visual Basic
      C# Tutorial
    Database Tutorial
     

    MySQL Tutorial

      MS SQL Tutorial
      Oracle Tutorial
    Geek Tutorial
     

    Blogging Tutorial

      RSS Tutorial
      Podcasting Tutorial
    Graphic Design Tutorial
      Coreldraw Tutorial
      Illustrator Tutorial
      3D Tutorials
    Webmaster Articles
     

    Domain Service

      Web Hosting
      Site Promotion
    Java Tutorial/ Articles
     

    Java Servlets

      JavaEE Tutorial
     

    JavaBeans Tutorial

    XML Tutorial/ Articles
     

    XML Style

      AJAX Tutorial
      XML Mobile
    Flash Tutorial/ Articles
     

    Flash Video

      Action Script
      Flash Articles
    OS Tutorial/ Articles
      Linux Tutorial
      Symbian Tutorial
      MacOS Tutorial
    Personal Tech
      Hardware Tutorial
      Software Tutorial
      Online Auction