球面碰撞解决
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;
我想编写一个 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;