gpt4 book ai didi

algorithm - Sphere - 球体碰撞检测 -> react

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:38:51 26 4
gpt4 key购买 nike

我需要制作一种算法来检测两个球体何时发生碰撞,以及碰撞后瞬间发生的方向。

假设,想象一下,当您在台球比赛中打开 table 时,所有的球都“随机”地相互碰撞。

所以,在开始自己编写代码之前,我在想是否已经有这个实现了。

提前致谢!

Cyas.-

最佳答案

碰撞部分很简单。检查球体中心之间的距离是否小于它们的半径之和。

至于弹跳,您需要交换对垂直于球体碰撞的总速度有贡献的速度量。 (假设你所有的球体都有相同的质量,不同质量的组合会有所不同)

struct Vec3 {
double x, y, z;
}

Vec3 minus(const Vec3& v1, const Vec3& v2) {
Vec3 r;
r.x = v1.x - v2.x;
r.y = v1.y - v2.y;
r.z = v1.z - v2.z;
return r;
}

double dotProduct(const Vec3& v1, const Vec3& v2) {
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}

Vec3 scale(const Vec3& v, double a) {
Vec3 r;
r.x = v.x * a;
r.y = v.y * a;
r.z = v.z * a;
return r;
}

Vec3 projectUonV(const Vec3& u, const Vec3& v) {
Vec3 r;
r = scale(v, dotProduct(u, v) / dotProduct(v, v));
return r;
}

int distanceSquared(const Vec3& v1, const Vec3& v2) {
Vec3 delta = minus(v2, v1);
return dotProduct(delta, delta);
}

struct Sphere {
Vec3 position;
Vec3 velocity;
int radius;
}

bool doesItCollide(const Sphere& s1, const Sphere& s2) {
int rSquared = s1.radius + s2.radius;
rSquared *= rSquared;
return distanceSquared(s1.position, s2.position) < rSquared;
}

void performCollision(Sphere& s1, Sphere& s2) {
Vec3 nv1; // new velocity for sphere 1
Vec3 nv2; // new velocity for sphere 2
// this can probably be optimised a bit, but it basically swaps the velocity amounts
// that are perpendicular to the surface of the collistion.
// If the spheres had different masses, then u would need to scale the amounts of
// velocities exchanged inversely proportional to their masses.
nv1 = s1.velocity;
nv1 += projectUonV(s2.velocity, minus(s2.position, s1.position));
nv1 -= projectUonV(s1.velocity, minus(s1.position, s2.position));
nv2 = s2.velocity;
nv2 += projectUonV(s1.velocity, minus(s2.position, s1.position));
nv2 -= projectUonV(s2.velocity, minus(s1.position, s2.position));
s1.velocity = nv1;
s2.velocity = nv2;
}

编辑:如果您需要更高的准确性,那么在发生碰撞时,您应该计算将两个碰撞球向后移动多远,以便它们相互接触,然后触发执行碰撞功能。这将确保角度更准确。

关于algorithm - Sphere - 球体碰撞检测 -> react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3232318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com