碰撞检测C++分离轴定理 我正在开发一个简单的碰撞引擎,C++中用于与SFML一起使用。我看了一些教程,得出结论,SAT对我的计划来说已经足够了,于是我开始实施。这似乎起了部分作用。测试时,最短路径的向量有时似乎是正确的
以下是我的函数,它们是碰撞检测的一部分碰撞检测C++分离轴定理 我正在开发一个简单的碰撞引擎,C++中用于与SFML一起使用。我看了一些教程,得出结论,SAT对我的计划来说已经足够了,于是我开始实施。这似乎起了部分作用。测试时,最短路径的向量有时似乎是正确的,c++,sfml,C++,Sfml,以下是我的函数,它们是碰撞检测的一部分 Range::Range(float mi, float ma) : min(mi), max(ma) { } Range Range::overlap(Range other) { Range r; r.min = min > other.min ? min : other.min; r.max = max < other.max ? max : other.max; return r; } Range Colli
Range::Range(float mi, float ma) :
min(mi), max(ma) {
}
Range Range::overlap(Range other) {
Range r;
r.min = min > other.min ? min : other.min;
r.max = max < other.max ? max : other.max;
return r;
}
Range CollisionShape::project(sf::Vector2f axis) {
float d = dot(_vertices_t[0], axis);
Range r(d, d);
for (unsigned i = 0; i < _num_vertices; i++) {
d = dot(_vertices_t[i], axis);
r.min = d < r.min ? d : r.min;
r.max = d > r.max ? d : r.max;
}
return r;
}
sf::Vector2f CollisionShape::sat(CollisionShape& other, bool own) {
sf::Vector2f ret;
bool first = true;
// Separating Axis Theorem
unsigned num = own ? _num_vertices : other._num_vertices;
sf::Vector2f* vertices = own ? _vertices_t : other._vertices_t;
for (unsigned i = 0; i < num; i++) {
sf::Vector2f v = normalize(vertices[(i + 1) % num] - vertices[i]);
sf::Vector2f n(v.y, -v.x);
Range r1 = project(n);
Range r2 = other.project(n);
if (r1.max < r2.min || r1.min > r2.max) {
return sf::Vector2f(0, 0);
}
Range overlap = r1.overlap(r2);
if (first || (overlap.max - overlap.min) < length(ret)) {
ret = -n * (overlap.max - overlap.min);
first = false;
}
}
return ret;
}
sf::Vector2f CollisionShape::collision(CollisionShape& other) {
// Test shape's potential separating axes
sf::Vector2f ret1 = sat(other, true);
if (ret1 == sf::Vector2f(0, 0)) {
return ret1;
}
// Test other shape's potential separating axes
sf::Vector2f ret2 = sat(other, false);
if (ret2 == sf::Vector2f(0, 0)) {
return ret2;
}
return (length(ret1) < length(ret2) ? ret1 : ret2);
}
我只是看不出问题出在哪里。
大编辑:嗯,我有点明白其中的联系。如果向量沿x轴或y轴包含一个0表示一个元素,则这些向量似乎是错误的。仍然不知道这是如何发生的。您可能需要清理代码。碰撞函数有两个基本相同的块,可以很容易地提取到一个函数中,以消除代码重复。是的,只有这两个块,稍后将被清除。但首要任务是让它工作。代码越短,调试就越容易。您是否制作了一个测试用例来显示错误行为?你没有给我们太多的机会,是的,我知道。我已经为上述两种场景添加了屏幕截图的链接。没有理由不将相同的代码提取到函数中。绝对没有。在不知道范围定义的情况下,存在一些高度可疑的复制粘贴代码。