Hello World / plɹoM ollǝH

Programmers Live in Vain

非弾性衝突

const auto r = (r0 + r1) * 0.5f; // 反発係数
const auto m0 = 1.0f; // Aの質量
const auto m1 = 1.0f; // Bの質量
const auto u0 = n * dot(vel0, n); // 衝突面(法線N)に対しての垂直方向のAの速度
const auto u1 = n * dot(vel1, n); // 衝突面(法線N)に対しての垂直方向のBの速度
const auto v0 = vel0 - u0; // 水平方向のAの速度
const auto v1 = vel1 - u1; // 水平方向のBの速度
const auto f0 = ((u1 - u0) * (r * m1) + (u0 * m0) + (u1 * m1)) / (m0 + m1); // 衝突後の垂直方向のAの速度
const auto f1 = ((u0 - u1) * (r * m0) + (u0 * m0) + (u1 * m1)) / (m0 + m1); // 衝突後の垂直方向のBの速度
vel0 = v0 + f0; // 水平方向と足して新しい速度ベクトルを作成
vel1 = v1 + f1; // 水平方向と足して新しい速度ベクトルを作成

摩擦を考慮する場合は摩擦係数で水平方向のベクトルを減衰させる