碰撞检测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表示一个元素,则这些向量似乎是错误的。仍然不知道这是如何发生的。

您可能需要清理代码。碰撞函数有两个基本相同的块,可以很容易地提取到一个函数中,以消除代码重复。是的,只有这两个块,稍后将被清除。但首要任务是让它工作。代码越短,调试就越容易。您是否制作了一个测试用例来显示错误行为?你没有给我们太多的机会,是的,我知道。我已经为上述两种场景添加了屏幕截图的链接。没有理由不将相同的代码提取到函数中。绝对没有。在不知道范围定义的情况下,存在一些高度可疑的复制粘贴代码。