我需要检测一个物体何时完全位于另一个物体内部以及它来自哪一侧。
我的球在屏幕周围反弹,可以进入其他方形物体的空间。我需要知道什么时候球完全放在盒子里,它是从哪一侧进来的。这是不是在包装盒的侧面只是碰撞检测,成球需要什么触发之前完全箱内。我正在使用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;
}
}
}
要检测何时球完全位于盒子内,可以在盒子内使用传感器固定装置,该传感器固定装置比盒子小,直径等于球的直径。在下图中,黑色矩形是方框,红色虚线矩形是传感器。(如果球的直径都不同,则将无法使用。)
至于“它进入哪一边”,我认为您需要先定义您的意思,然后才能帮助任何人。我的意思是,请查看您正在处理的可能情况。蓝色的球是最直接的,因为它以恒定的方向靠近一侧。当检测到它接触到传感器时,可以按照sp2danny的建议使用行进方向,从盒子外部到球的当前位置进行射线投射,并且其进入的一侧非常明显。但这不适用于绿色或粉红色的球。特别是对于粉红色的球,您认为它从哪一侧进入?
现在,我假设这些球可以自由地从任何角度进入盒子。但是,如果它们的拐角处有牢固的障碍物,则可以更清晰地定义它们进入的一侧。您可以在外部使用四个传感器,并检测何时球完了碰到这些传感器。
但是,它并不是防弹的,因为在极少数情况下,一个球可能会在一个时间步中从一个侧面传感器碰到另一个侧面传感器,而中间没有碰到任何东西(绿色的球)。对于速度非常快的球,它们也有可能从触摸一个侧面传感器变为完全进入内部,而无需触及它们“进入”一侧的传感器(粉红色球)。从好的方面来说,当您有许多不同大小的球时,这将可以解决这种情况。
好的,现在我写了整篇文章,说如何不容易做到,我有一个好主意,尽管只有在所有球都相同的情况下它才能工作。您可以在盒子内使用两个传感器,一个由球的半径插入,一个由球的直径插入。当球第一次接触这些传感器的外部时,这意味着球的中心已经从外部交叉到了盒子的内部(但整个球可能未完全位于内部)。此时,在先前位置和当前位置之间进行射线广播,并注意其相交的一侧。继续直到球也接触到内部传感器,然后您才知道它完全位于内部,并且您已经注意到它最初来自哪一侧。如果球在任何时候都停止接触外部传感器,请重置为开始状态。
请注意,球仍然有可能先从一侧接触盒子,然后移动,以便其中心第一次进入盒子内部时是从另一侧(橙色球)开始。但是我假设您不会仅仅将触摸视为“进来”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句