Search content:

 

Personal Menu
Username:
Password:
Save password

Become a member

Forgot Password?

 

Don't miss these
Check and launch dialup
Opening and closing a CD-door behaviour
alt.multimedia.director
Macromedia Licensing
Version
Type Writer Fonts
V12-L
Set CommonPlayer properties for Director 2004
Drag & Drop
Card Shuffler
MediaMacros Xtras Mall
 

 

 

Behavior 2D Collision from Explore Science

Added on 6/8/1999

 

Compatibilities:
behavior D6_5 Mac PC

Rating:

Author: RamanPfaff

This script is for the collision of two round objects (b <> 0). When your objects "collide" you call this script. Typically I would just check for distance between the two objects on an exitframe and when they "touch" (d ~ 0) I'd call this script, and with the results I would send a message to the objects and let them know what their velocities are after the collision.

on dealWithCollision x1,y1,v1xi,v1yi,x2,y2,v2xi,v2yi,m1,m2
  -- by Raman Pfaff (pfaff@ExploreScience.com)
  -- This script is for the collision of two round objects (b <> 0).
  -- when your objects "collide" you call this script. Typically I would
  -- just check for distance between the two objects on an exitframe
  -- and when they "touch" (d ~ 0) I"d call this script, and with the results
  -- I would send a message to the objects and let them know what their
  -- velocities are after the collision.
  
  -- the initial parameters that you send to this script are as follows
  -- the number (1 or 2) represent the two objects that have collided
  -- x and y are the locations
  -- the v"s are the velocity components (v1xi = initial x velocity of
  -- object 1)
  -- the m"s are the object masses
  
  set term = pi()/180.  -- converting some radian stuff later
  
  -- find the velocity magnitudes
  set v1 = sqrt(power(v1xi,2)+power(v1yi,2))
  set v2 = sqrt(power(v2xi,2)+power(v2yi,2))
  
  -- find the direction of motion before the collision
  set t1 = findThetaTan(v1xi,v1yi)
  set t2 = findThetaTan(v2xi,v2yi)
  
  -- find the angle of "contact" for the two objects
  set phi = findThetaTan(x2-x1,y2-y1)
  
  
  -- set coefficient of restitution here temporarily...set it elsewhere later.
  -- this code set up for elastic...deal with inelastic differently...
  set e = 1.
  
  -- convert to a new reference frame for simplicity
  -- now solve for relative velocities relative to "normal" reference frame
  set v1xr = v1*cos((t1-phi)*term)
  set v1yr = v1*sin((t1-phi)*term)
  set v2xr = v2*cos((t2-phi)*term)
  set v2yr = v2*sin((t2-phi)*term)
  
  -- now find the final velocities in the normal reference frame
  set v1fxr = ((m1-m2*e)*v1xr+(m2+m2*e)*v2xr)/(m1+m2)
  set v2fxr = v1fxr +e*(v1xr-v2xr)
  set v1fyr = v1yr
  set v2fyr = v2yr
  
  -- and convert those velocities back to the "standard" coordinate system
  set v1fx = cos(phi*term)*v1fxr+cos((phi+90)*term)*v1fyr
  set v1fy = sin(phi*term)*v1fxr+sin((phi+90)*term)*v1fyr
  set v2fx = cos(phi*term)*v2fxr+cos((phi+90)*term)*v2fyr
  set v2fy = sin(phi*term)*v2fxr+sin((phi+90)*term)*v2fyr
  
  -- return the final velocities as a list
  set temp = []
  set temp = [v1fx,v2fy,v2fx,v2fy]
  return temp
end

on findThetaTan xthing,ything
  -- once again, this is hideous, but I kept copying it that week...I
  -- should slap my other one in here...
  -- one of these days.
  
  set term = pi()/180.
  if xthing < 0. then
    set t = 180.+ atan(ything/xthing)/term
  else if xthing > 0. and ything >= 0. then
    set t = atan(ything/xthing)/term
  else if xthing > 0. and ything < 0. then
    set t = 360.+atan(ything/xthing)/term
  else if xthing = 0. and ything = 0. then
    set t=0.
  else if xthing = 0. and ything >= 0. then
    set t = 90.
  else
    set t = 270.
  end if
  return t
end  

 


Upload Provided by ABCUpload ASP

Contact

MMI
22 West Court Sq
Suite 2C
Newnan, GA 30263
USA

Fax - (206) 339-5833

Send e-mail