5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# File 'lib/pongo/collision_resolver.rb', line 5
def self.resolve(pa, pb, normal, depth)
mtd = normal * depth
te = pa.elasticity + pb.elasticity
sum_inv_mass = pa.inv_mass + pb.inv_mass
tf = MathUtil.clamp(1 - (pa.friction + pb.friction), 0, 1)
ca = pa.components(normal)
cb = pb.components(normal)
vn_a = (cb.vn * ((te + 1) * pa.inv_mass) +
(ca.vn * (pb.inv_mass - te * pa.inv_mass))) / sum_inv_mass
vn_b = (ca.vn * ((te + 1) * pb.inv_mass) +
(cb.vn * (pa.inv_mass - te * pb.inv_mass))) / sum_inv_mass
ca.vt.mult!(tf)
cb.vt.mult!(tf)
mtd_a = mtd * ( pa.inv_mass / sum_inv_mass)
mtd_b = mtd * (-pb.inv_mass / sum_inv_mass)
vn_a.plus!(ca.vt)
vn_b.plus!(cb.vt)
pa.resolve_collision(mtd_a, vn_a, normal, depth, -1, pb)
pb.resolve_collision(mtd_b, vn_b, normal, depth, 1, pa)
end
|