我需要检测身体完全在另一个身体内从哪个身体进入。
我的球在屏幕周围反弹,可以进入其他方体的空间。我需要知道球何时完全进入箱内,以及它从哪一侧进来。这只是 NOT 只是在盒子的一侧进行碰撞检测,因为在任何触发之前球需要完全位于盒子内部。我使用b2FixtureDef :: filter :: maskBits和b2FixtureDef :: filter :: categoryBits来让球和盒子不会相互碰撞。
我是box2d的新手,但不是C ++,所以我可能会错过一些可以让我更容易的功能。我开始编写下面的代码,当球通过正确的边时,以及当它通过其他边时,它会起作用。
有没有办法在不将球复制到另一个数据结构的情况下执行此操作,该数据结构可以跟踪它首次接触盒子的位置?
注意:此代码就是一个例子。它实际上可能无法编译或完全按照我的说法进行操作。
void CBox::captureBalls(std::list<CBall> &balls)
{
std::list<CBall> capturedBalls;
std::list<CBall>::iterator ball = balls.begin();
while (ball != balls.end()) {
bool capture = false;
int ballMinX = ball->getX() - ball->getRadius();
int ballMaxX = ball->getX() + ball->getRadius();
int ballMinY = ball->getY() - ball->getRadius();
int ballMaxY = ball->getY() + ball->getRadius();
switch (this->captureSide) {
case Top:
if ((ballMinX >= this->x) &&
(ballMaxX < (this->x + this->width)) &&
//(ballMinY >= this->y) &&
(ballMaxY < (this->y + this->height)))
capture = true;
break;
case Right:
if (//(ballMinX >= this->x) &&
(ballMaxX < (this->x + this->width)) &&
(ballMinY >= this->y) &&
(ballMaxY < (this->y + this->height)))
capture = true;
break;
case Bottom:
if ((ballMinX >= this->x) &&
(ballMaxX < (this->x + this->width)) &&
(ballMinY >= this->y) /*&&
(ballMaxY < (this->y + this->height))*/)
capture = true;
break;
case Left:
if ((ballMinX >= this->x) &&
//(ballMaxX < (this->x + this->width)) &&
(ballMinY >= this->y) &&
(ballMaxY < (this->y + this->height)))
capture = true;
break;
}
if (capture) {
capturedBalls.push_back(ball);
balls.erase(ball++);
}
else {
++ball;
}
}
}
答案 0 :(得分:2)
要检测球何时完全位于盒子内部,您可以使用盒子内部的传感器夹具,该传感器夹具比球体直径小。在下图中,黑色矩形是框,红色虚线矩形是传感器。 (如果球都有不同的直径,这将不起作用。)
关于&#34;它进入的哪一方&#34;,我认为你需要在任何人可以帮助之前定义你的意思。我的意思是,看看你正在处理的可能案例。蓝球是最直接的,因为它在一侧接近恒定方向。当你检测到它接触到传感器时,你可以按照sp2danny的建议使用行进方向,从盒子外面做一个光线投射到球的当前位置,它输入的一侧非常明显。但这不适用于绿色或粉红色的球。特别是对于粉红色的球,你认为从哪个方面进入?
现在我假设球可以从任何角度自由进入盒子。但是如果它们的角落有一个坚固的障碍物,那么定义它们进入哪一侧可能会更清楚。你可以在外部使用四个传感器,并检测一下球完成接触这些传感器。{{ 0}}
然而,它不会是防弹的,因为在极少数情况下,球可以在一个时间步长内从触摸一侧传感器到另一侧传感器,而不会触及它们之间的任何东西(绿球)。对于真正快速的球,它们也可能从触摸一侧传感器到完全内部,而不会触及传感器,因为它们进入了#34; (粉球)。从好的方面来说,当你有许多不同尺寸的球时,这将处理这种情况。
好的......现在我已经写了一篇文章,说明如何轻松完成,我有一个好主意,虽然它只适用于所有球的大小相同的情况。你可以在盒子里面使用两个传感器,一个是球的半径,一个是球的直径。当球首先接触到这些传感器的外部时,这意味着球的中心从外部越过,越过盒子内部(但整个球可能不完全在内部)。此时,在前一个位置和当前位置之间进行光线投射,并记下它与哪一侧相交。继续,直到球也触及内部传感器,然后你知道它完全在里面,你已经注意到它最初来自哪一侧。如果球在任何时候停止接触外部传感器,请重置为起始状态。
请注意,球仍然可以首先从一侧接触盒子,然后移动,使其第一次在盒子内部的中心位于另一侧(橙色球)。但我假设你不会仅仅因为&#34;进入&#34;。