Add mass to collision calculation

This commit is contained in:
Quinn
2021-12-26 21:49:44 -08:00
parent 3ec46b6bbf
commit 936c8fe40f
3 changed files with 22 additions and 10 deletions
+4
View File
@@ -5,6 +5,10 @@ ball = {
vel = vec2:new(0,0), vel = vec2:new(0,0),
rad = 1, rad = 1,
col = 7, col = 7,
mass = function()
return rad
end,
draw = function(self) draw = function(self)
circfill(self.pos.x, self.pos.y, self.rad, self.col) circfill(self.pos.x, self.pos.y, self.rad, self.col)
+7 -5
View File
@@ -45,9 +45,9 @@ function handle_collisions()
rewind = 0.1 * steps rewind = 0.1 * steps
s_xpoint = source.pos - source.vel * rewind s_xpoint = source.pos - source.vel * rewind
t_xpoint = target.pos - target.vel * rewind t_xpoint = target.pos - target.vel * rewind
until rewind > 1 or (s_xpoint - t_xpoint):mag() >= source.rad + target.rad 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 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) local t_newvel = collision_vel(t_xpoint, target.vel, s_xpoint, source.vel, target.mass(), source.mass())
source.pos = s_xpoint + source.vel * rewind source.pos = s_xpoint + source.vel * rewind
target.pos = t_xpoint + target.vel * rewind target.pos = t_xpoint + target.vel * rewind
source.vel = s_newvel source.vel = s_newvel
@@ -56,8 +56,10 @@ function handle_collisions()
end end
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 x_diff = x1 - x2
local v_diff = v1 - v2 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 end
+11 -5
View File
@@ -62,6 +62,10 @@ ball = {
vel = vec2:new(0,0), vel = vec2:new(0,0),
rad = 1, rad = 1,
col = 7, col = 7,
mass = function()
return rad
end,
draw = function(self) draw = function(self)
circfill(self.pos.x, self.pos.y, self.rad, self.col) circfill(self.pos.x, self.pos.y, self.rad, self.col)
@@ -160,9 +164,9 @@ function handle_collisions()
rewind = 0.1 * steps rewind = 0.1 * steps
s_xpoint = source.pos - source.vel * rewind s_xpoint = source.pos - source.vel * rewind
t_xpoint = target.pos - target.vel * rewind t_xpoint = target.pos - target.vel * rewind
until rewind > 1 or (s_xpoint - t_xpoint):mag() >= source.rad + target.rad 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 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) local t_newvel = collision_vel(t_xpoint, target.vel, s_xpoint, source.vel, target.mass(), source.mass())
source.pos = s_xpoint + source.vel * rewind source.pos = s_xpoint + source.vel * rewind
target.pos = t_xpoint + target.vel * rewind target.pos = t_xpoint + target.vel * rewind
source.vel = s_newvel source.vel = s_newvel
@@ -171,10 +175,12 @@ function handle_collisions()
end end
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 x_diff = x1 - x2
local v_diff = v1 - v2 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 end
__gfx__ __gfx__