球面碰撞解决

Sphere-plane collision resolve

我想编写一个 c++ 程序来计算球体和平面之间的碰撞。

规则是下落物体的角度等于反射角。

我有什么球体:

//sphere coordinates and radius
float x;
float y;
float z;
float r;
//sphere velocity vector projections
float vx;
float vy;
float vz;

平面由平面方程系数描述:

float A;
float B;
float C;
float D;

球面碰撞检测我没有问题。但是碰撞后如何求速度呢?

我发现了什么:

所以,最终我需要计算 vx vy vz 的更新值。

定义平面的方程是

Ax + By + Cz + D = 0

所以垂直于平面的向量是

W = (A, B, C)

标准化:

n = W/|W|

现在取速度矢量:

V = (vx, vy, vz)

它垂直于平面的分量是

Vn = (V . n) n

剩下的,平行于平面的部分是

Vp = V - Vn

我们要反转法向分量,而平行分量不变:

V' = -Vn + Vp

结果是

V' = V - 2(V . n)n

@Beta对c++的回答:

float wl = sqrt(plane->A*plane->A+plane->B*plane->B+plane->C+plane->C); // “W” vector length

float nx = plane->A/wl; //Normal components
float ny = plane->B/wl;
float nz = plane->C/wl;

float scope = (sphere->vx*nx + sphere->vy*ny + sphere->vz*nz)*2; // 2(V . n)

nx = nx*scope; // 2(V . n)n
ny = ny*scope;
nz = nz*scope;

sphere->vx -= nx; // V' = V - 2(V . n)n
sphere->vy -= ny;
sphere->vz -= nz;