基于an answer to a previous question of mine about angular velocity,我修改了给定的演示并实现了分离轴定理(碰撞检测)以及基本的线性脉冲分辨率。 (here's the JSFiddle)。但是,响应存在一个小问题。
如果身体设法相互穿透(偶尔会发生),穿透的身体暂时消失,然后当它们不再穿透时再次出现。但为什么呢?
let aVel = [a.dx, a.dy];
let bVel = [b.dx, b.dy];
const invA = a.static ? 0 : 1 / a.mass;
const invB = b.static ? 0 : 1 / b.mass;
const relativeVel = Sub(bVel, aVel);
const velAlongNorm = DotProduct(relativeVel, data.unit);
if (velAlongNorm > 0)
return;
const cor = a.cor * b.cor;
let _j = -(1 + cor) * velAlongNorm;
_j /= invA + invB;
const impulse = ScalarMultiply(data.unit, _j);
aVel = Sub(aVel, ScalarMultiply(impulse, invA));
bVel = Add(bVel, ScalarMultiply(impulse, invB));
a.dx = aVel[0];
a.dy = aVel[1];
b.dx = bVel[0];
b.dy = bVel[1];
const percent = 0.2;
const slop = 0.01;
const correction = Math.max(data.overlap - slop, 0) / (invA + invB) * percent;
a.x -= invA * correction;
a.y -= invA * correction;
b.x += invB * correction;
b.y += invB * correction;
请注意,dx
和dy
指的是机构的x和y分量。速度和COR
分别指恢复系数。 (bounciness)invA
和invB
是反向质量。
如何解决穿透体消失的问题?
答案 0 :(得分:0)
通过将碰撞法线乘以重叠来计算。 (AKA渗透,深度等)