Add mass to collision calculation
This commit is contained in:
@@ -6,6 +6,10 @@ ball = {
|
||||
rad = 1,
|
||||
col = 7,
|
||||
|
||||
mass = function()
|
||||
return rad
|
||||
end,
|
||||
|
||||
draw = function(self)
|
||||
circfill(self.pos.x, self.pos.y, self.rad, self.col)
|
||||
end,
|
||||
|
||||
@@ -46,8 +46,8 @@ function handle_collisions()
|
||||
s_xpoint = source.pos - source.vel * rewind
|
||||
t_xpoint = target.pos - target.vel * rewind
|
||||
until rewind > 1 or (s_xpoint - t_xpoint):mag() >= source.rad + target.rad
|
||||
local s_newvel = collision_vel(s_xpoint, source.vel, t_xpoint, target.vel)
|
||||
local t_newvel = collision_vel(t_xpoint, target.vel, s_xpoint, source.vel)
|
||||
local s_newvel = collision_vel(s_xpoint, source.vel, t_xpoint, target.vel, source.mass(), target.mass())
|
||||
local t_newvel = collision_vel(t_xpoint, target.vel, s_xpoint, source.vel, target.mass(), source.mass())
|
||||
source.pos = s_xpoint + source.vel * rewind
|
||||
target.pos = t_xpoint + target.vel * rewind
|
||||
source.vel = s_newvel
|
||||
@@ -56,8 +56,10 @@ function handle_collisions()
|
||||
end
|
||||
end
|
||||
|
||||
function collision_vel(x1,v1,x2,v2)
|
||||
function collision_vel(x1,v1,x2,v2,m1,m2)
|
||||
m1 = m1 or 1
|
||||
m2 = m2 or 1
|
||||
local x_diff = x1 - x2
|
||||
local v_diff = v1 - v2
|
||||
return v1 - x_diff * v_diff:dot(x_diff) / x_diff:mag()^2
|
||||
return v1 - x_diff * (2 * m2 / (m1 + m2)) * v_diff:dot(x_diff) / x_diff:mag()^2
|
||||
end
|
||||
|
||||
@@ -63,6 +63,10 @@ ball = {
|
||||
rad = 1,
|
||||
col = 7,
|
||||
|
||||
mass = function()
|
||||
return rad
|
||||
end,
|
||||
|
||||
draw = function(self)
|
||||
circfill(self.pos.x, self.pos.y, self.rad, self.col)
|
||||
end,
|
||||
@@ -161,8 +165,8 @@ function handle_collisions()
|
||||
s_xpoint = source.pos - source.vel * rewind
|
||||
t_xpoint = target.pos - target.vel * rewind
|
||||
until rewind > 1 or (s_xpoint - t_xpoint):mag() >= source.rad + target.rad
|
||||
local s_newvel = collision_vel(s_xpoint, source.vel, t_xpoint, target.vel)
|
||||
local t_newvel = collision_vel(t_xpoint, target.vel, s_xpoint, source.vel)
|
||||
local s_newvel = collision_vel(s_xpoint, source.vel, t_xpoint, target.vel, source.mass(), target.mass())
|
||||
local t_newvel = collision_vel(t_xpoint, target.vel, s_xpoint, source.vel, target.mass(), source.mass())
|
||||
source.pos = s_xpoint + source.vel * rewind
|
||||
target.pos = t_xpoint + target.vel * rewind
|
||||
source.vel = s_newvel
|
||||
@@ -171,10 +175,12 @@ function handle_collisions()
|
||||
end
|
||||
end
|
||||
|
||||
function collision_vel(x1,v1,x2,v2)
|
||||
function collision_vel(x1,v1,x2,v2,m1,m2)
|
||||
m1 = m1 or 1
|
||||
m2 = m2 or 1
|
||||
local x_diff = x1 - x2
|
||||
local v_diff = v1 - v2
|
||||
return v1 - x_diff * v_diff:dot(x_diff) / x_diff:mag()^2
|
||||
return v1 - x_diff * (2 * m2 / (m1 + m2)) * v_diff:dot(x_diff) / x_diff:mag()^2
|
||||
end
|
||||
|
||||
__gfx__
|
||||
|
||||
Reference in New Issue
Block a user