【问题标题】:Multi-dimensional bounding box collision detection多维边界框碰撞检测
【发布时间】:2012-12-05 05:52:42
【问题描述】:

有 2D/3D 边界框碰撞检测的答案,但我的问题是如何将情况发展到多维(4D 或更多)?

这是 3D 案例的代码。

template<typename T, typename _Prd>
bool BoundingBox3<T,_Prd>::Collision( const BoundingBox3<T,_Prd>& cube ) const
{

    Point3<T,_Prd> min_1 = center - Point3<T,_Prd>(length,depth,height)/2.0;
    Point3<T,_Prd> max_1 = center + Point3<T,_Prd>(length,depth,height)/2.0;

    Point3<T,_Prd> min_2 = cube.Center() - Point3<T,_Prd>(cube.Length(),cube.Depth(),cube.Height())/2.0;
    Point3<T,_Prd> max_2 = cube.Center() + Point3<T,_Prd>(cube.Length(),cube.Depth(),cube.Height())/2.0;

    if(Volume()<cube.Volume())
    {
        Vector3D::Swap(min_1,min_2);
        Vector3D::Swap(max_1,max_2);
    }

    if(min_1[0]<=min_2[0] && min_1[1]<=min_2[1] && min_1[2]<=min_2[2]
    && max_1[0]>=min_2[0] && max_1[1]>=min_2[1] && max_1[2]>=min_2[2])
        return true;

    if(min_1[0]<=max_2[0] && min_1[1]<=max_2[1] && min_1[2]<=max_2[2]
    && max_1[0]>=max_2[0] && max_1[1]>=max_2[1] && max_1[2]>=max_2[2])
        return true;

    return false;
};

【问题讨论】:

  • @Aesthete,是的,我想写一个更通用的碰撞检测函数。

标签: c++ algorithm math game-physics


【解决方案1】:

如果在所有维度上都存在相交范围,则一个框与另一个框发生碰撞。

范围 [a,b] 与范围 [c,d] 的交集是 [max(a,c),min(b,d)]。

在范围不相交的情况下,结果将是无效范围,范围的开始大于范围的结束。

所以碰撞可以这样进行:

bool collides(const Box &box1,const Box &box2)
{
  assert(box1.numberOfDimensions()==box2.numberOfDimensions());
  for (size_t i=0; i!=box1.numberOfDimensions(); ++i) {
    float a = max(box1.minForDimension(i),box2.minForDimension(i));
    float b = min(box1.maxForDimension(i),box2.maxForDimension(i));
    if (a>b) return false;
  }
  return true;
}

【讨论】:

  • 谢谢,非常聪明的回答。我没想到会这么容易。
猜你喜欢
  • 2015-02-01
  • 2014-02-04
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多