Box2d检测何时一个物体完全位于另一个物体内部以及它从哪一侧进入

邪恶的

我需要检测一个物体何时完全位于另一个物体内部以及它来自哪一侧

我的球在屏幕周围反弹,可以进入其他方形物体的空间。我需要知道什么时候球完全放在盒子里,它是从哪一侧进来的。这是不是在包装盒的侧面只是碰撞检测,成球需要什么触发之前完全箱内。我正在使用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;
        }
    }
}
iforce2d

要检测何时球完全位于盒子内,可以在盒子内使用传感器固定装置,该传感器固定装置比盒子小,直径等于球的直径。在下图中,黑色矩形是方框,红色虚线矩形是传感器。(如果球的直径都不同,则将无法使用。)

至于“它进入哪一边”,我认为您需要先定义您的意思,然后才能帮助任何人。我的意思是,请查看您正在处理的可能情况。蓝色的球是最直接的,因为它以恒定的方向靠近一侧。当检测到它接触到传感器时,可以按照sp2danny的建议使用行进方向,从盒子外部到球的当前位置进行射线投射,并且其进入的一侧非常明显。但这不适用于绿色或粉红色的球。特别是对于粉红色的球,您认为它从哪一侧进入?在此处输入图片说明

现在,我假设这些球可以自由地从任何角度进入盒子。但是,如果它们的拐角处有牢固的障碍物,则可以更清晰地定义它们进入的一侧。您可以在外部使用四个传感器,并检测何时球完了碰到这些传感器在此处输入图片说明

但是,它并不是防弹的,因为在极少数情况下,一个球可能会在一个时间步中从一个侧面传感器碰到另一个侧面传感器,而中间没有碰到任何东西(绿色的球)。对于速度非常快的球,它们也有可能从触摸一个侧面传感器变为完全进入内部,而无需触及它们“进入”一侧的传感器(粉红色球)。从好的方面来说,当您有许多不同大小的球时,这将可以解决这种情况。

好的,现在我写了整篇文章,说如何不容易做到,我有一个好主意,尽管只有在所有球都相同的情况下它才能工作。您可以在盒子内使用两个传感器,一个由球的半径插入,一个由球的直径插入。当球第一次接触这些传感器的外部时,这意味着球的中心已经从外部交叉到了盒子的内部(但整个球可能未完全位于内部)。此时,在先前位置和当前位置之间进行射线广播,并注意其相交的一侧。继续直到球也接触到内部传感器,然后您才知道它完全位于内部,并且您已经注意到它最初来自哪一侧。如果球在任何时候都停止接触外部传感器,请重置为开始状态。在此处输入图片说明

请注意,球仍然有可能先从一侧接触盒子,然后移动,以便其中心第一次进入盒子内部时是从另一侧(橙色球)开始。但是我假设您不会仅仅将触摸视为“进来”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Box2d检测何时一个物体完全位于另一个物体内部以及它从哪一侧进入

来自分类Dev

如何在 QML Box2D 中最靠近碰撞点的一侧将两个物体连接在一起?

来自分类Dev

Box2d主体进入另一个主体

来自分类Dev

我如何让一个物理物体抵消另一个物理物体的碰撞。

来自分类Dev

如何判断一个物体是否在另一个物体的距离之内?

来自分类Dev

SpriteKit-计算一个物体击中另一个物体的次数

来自分类Dev

一旦玩家进入一个物体并在它进入另一个物体时停止触发计时器

来自分类Dev

检测何时SKSpriteNode完全位于另一个SKSpriteNode之下

来自分类Dev

检测何时SKSpriteNode完全位于另一个SKSpriteNode之下

来自分类Dev

如何聆听另一个物体的事件发射?

来自分类Dev

跟随另一个正在旋转的物体

来自分类Dev

如何聆听另一个物体的事件发射?

来自分类Dev

传送后将一个物体移动到另一个物体上的同一点

来自分类Dev

绕着另一个物体旋转的物体不断加速

来自分类Dev

动态缩放堆叠在另一个物体上的物体

来自分类Dev

如何在另一个物体周围移动某个物体?

来自分类Dev

一个物体不动

来自分类Dev

检查一个物理物体是否在不等待didBeginContact的情况下接触另一个物体

来自分类Dev

javascript preappend将新的div加载到另一个的一侧

来自分类Dev

找到两个物体的高度差异并将高度分配给另一个物体

来自分类Dev

试图使div粘在另一个居中的div的一侧并固定在一个位置

来自分类Dev

为什么一个物体的质量永远不能比另一物体大100倍?

来自分类Dev

一个位于另一个顶部的Imagebutton无法单击另一个之下的一个-Scene2d LIBGDX

来自分类Dev

如何检测HorizontalScrollView内部的视图何时触摸另一个视图?

来自分类Dev

如何将不可包裹的物体从一个活动传递到另一个活动?

来自分类Dev

如何将物体从一个碎片传递到另一个碎片?

来自分类Dev

小写一个液体物体

来自分类Dev

给移动的物体一个方向

来自分类Dev

如何判断一个空物体?

Related 相关文章

  1. 1

    Box2d检测何时一个物体完全位于另一个物体内部以及它从哪一侧进入

  2. 2

    如何在 QML Box2D 中最靠近碰撞点的一侧将两个物体连接在一起?

  3. 3

    Box2d主体进入另一个主体

  4. 4

    我如何让一个物理物体抵消另一个物理物体的碰撞。

  5. 5

    如何判断一个物体是否在另一个物体的距离之内?

  6. 6

    SpriteKit-计算一个物体击中另一个物体的次数

  7. 7

    一旦玩家进入一个物体并在它进入另一个物体时停止触发计时器

  8. 8

    检测何时SKSpriteNode完全位于另一个SKSpriteNode之下

  9. 9

    检测何时SKSpriteNode完全位于另一个SKSpriteNode之下

  10. 10

    如何聆听另一个物体的事件发射?

  11. 11

    跟随另一个正在旋转的物体

  12. 12

    如何聆听另一个物体的事件发射?

  13. 13

    传送后将一个物体移动到另一个物体上的同一点

  14. 14

    绕着另一个物体旋转的物体不断加速

  15. 15

    动态缩放堆叠在另一个物体上的物体

  16. 16

    如何在另一个物体周围移动某个物体?

  17. 17

    一个物体不动

  18. 18

    检查一个物理物体是否在不等待didBeginContact的情况下接触另一个物体

  19. 19

    javascript preappend将新的div加载到另一个的一侧

  20. 20

    找到两个物体的高度差异并将高度分配给另一个物体

  21. 21

    试图使div粘在另一个居中的div的一侧并固定在一个位置

  22. 22

    为什么一个物体的质量永远不能比另一物体大100倍?

  23. 23

    一个位于另一个顶部的Imagebutton无法单击另一个之下的一个-Scene2d LIBGDX

  24. 24

    如何检测HorizontalScrollView内部的视图何时触摸另一个视图?

  25. 25

    如何将不可包裹的物体从一个活动传递到另一个活动?

  26. 26

    如何将物体从一个碎片传递到另一个碎片?

  27. 27

    小写一个液体物体

  28. 28

    给移动的物体一个方向

  29. 29

    如何判断一个空物体?

热门标签

归档