• home
  • forum
  • my
  • kt
  • download
  • Simulating Gravity (Or Any Attractive Force)

    Author: 2007-06-05 16:45:40 From:

    Simulating Gravity

    Here are the steps I took to make this.


    1. I created a sun movieclip and an earth movieclip and placed them on the stage with instance names ball1 and ball2 respectively.
    2. I used FlashGuru's function that determines the distance between two movieclips and returns a distance object (with a slight modification).
    3. Using the info in the distance object I determined what the velocities and accelerations of the bodies.

    Step 1

    Rename Layer 1 "Earth and Sun". Then, on layer 1:
    Place an instance of your sun movieclip near the center of the stage (I used a 400x300 pixel stage and made both the sun and earth 60x60 pixels). Place an instance of the earth clip halfway between the sun and the right border of your movie. Give the sun an instance name of ball1 and the earth and instance name of ball2.

    Step 2

    Add a second layer to the main timeline called actions On the first keyframe of the actions layer, add this actionscript:

    Movieclip.prototype.distance=function(moviec){
     if(typeof(moviec) == "string"){
     moviec=eval(moviec)
     }
     var temp=new Object()
     temp.distx=moviec._x-this._x
     temp.disty=moviec._y-this._y
     temp.distance=Math.sqrt((temp.distx*temp.distx)+(temp.disty*temp.disty))
     if (temp.distx>0) {
     temp.directionx=1;
     }
     else {
     temp.directionx=-1;
     }
     if (temp.disty>0) {
     temp.directiony=1;
     }
     else {
     temp.directiony=-1;
     }
     return temp
    }
    

    This sets up a function that can be applied to our movieclips and returns an object containing the following data:

    distx=distance between two clips on the x axis
    disty=distance between two clips on the y axis
    distance=distance between two clips in a straight line
    directionx & directiony=numbers that are 1 or -1 depending on whether movieclip1 is above or below or left of or right of movieclip2

    Step 3

    Next I added the following code to the sun, ball1.

    onClipEvent (load) {
     xvel=.0;
     yvel=.05;
    }
    onClipEvent (enterFrame) {
     this.xvel+=xa*.05;
     this.yvel+=ya*.05;
     this._x+=xvel;
     this._y+=yvel;
     if (this._x>400 || this._x<0) {
     xvel*=-1;
     }
     if (this._y>300 || this._y<0) {
     yvel*=-1;
     }
     distanceobject=this.distance(_root.ball2);
     r=distanceobject.distance;
     theta=Math.atan(distanceobject.disty/distanceobject.distx);
     a=240/r/r;
     xa=Math.abs(Math.cos(theta))*a*distanceobject.directionx;
     ya=Math.abs(Math.sin(theta))*a*distanceobject.directiony;
    }
    

    This code does the following:

    Sets the x velocity and y velocity to initial values.
    On enterFrame adds the x component of acceleration to the x velocity and does the same with y (this.xvel+=xa*.05) I will explain the *.05 later.
    Adds the velocity values to the position values of this clip (this._x+=xvel).
    Checks boundary conditions to see if we are flying off the stage.
    Then the real math!

    First I called the distance formula on ball1 with ball2 as the argument.
    I set r=the distance between the two balls.
    I found the angle of the distance between the two balls.
    I set the accleration to 240(a constant) divided by r^2(since gravity is inveresly proportional to distance)
    I found the x and y components of the acceleration by using cos and sin of the angle between the balls and multiplying it by directionx or direction y to give the acceleration the right sign(+/-).

    Then I added this code to ball2

    onClipEvent (load) {
     xvel=0;
     yvel=-1;
    }
    onClipEvent (enterFrame) {
     this.xvel-=_root.ball1.xa;
     this.yvel-=_root.ball1.ya;
     //this.xvel*=.99;
     //this.yvel*=.99;
     this._x+=xvel;
     this._y+=yvel;
     if (this._x>400 || this._x<27) {
     xvel*=-1;
     }
     if (this._y>300 || this._y<27) {
     yvel*=-1;
     }
    }
    


    This is pretty much the same as ball2 except we subtract the acceleration from velocity instead of adding it
    I have the comments this.xvel*=.99; in case you want to add friction to the equation.

    Finally, the reason I multiplied the sun's acceleration by .05 is because it is more massive than the earth and should be affected less by the gravity. In reality, instead of .05 we would use a much smaller number so that the suns motion would be imperceptible.
    You can play around with this value, the xvel and yvel in the onClipEven (load) statements, and the 240 in the code that determines acceleration and see what happens!

    This is my first tutorial and I am not sure if I am doing this right. Any comments would be appreciated. Hopefully I will have a tute on gravity with more than 2 objects soon.

    discuss this topic to forum

    relation tutorial

    No information

    Category

      3D (36)
      Math Physics (18)
      3rd Party (10)
      Navigation (70)
      Actionscripting (228)
      Optimization (17)
      Animation (166)
      Projector (11)
      Audio (54)
      Special Effects (170)
      Backend (26)
      Text Effects (92)
      Drawing (34)
      Tips and Techniques (58)
      Dynamic Content (38)
      Tricks (8)
      Games (114)
      Utilities (24)
      Getting Started (99)
      Video (59)
      Interactivity (48)
      Web Design (37)

    New

    Hot