传感器与运动与动态夹具接触

时间:2016-12-30 12:59:02

标签: qml box2d

我试图通过向静止物体添加传感器来检测移动物体。 box1是静止的并且有一个大的圆形传感器,box2是运动学的,并通过设置其线速度来移动。

import QtQuick 2.6
import QtQuick.Window 2.2
import Box2D 2.0 as Box2D

Window {
    id: window
    width: 640
    height: 480
    visible: true

    Box2D.World {
        id: physicsWorld
        gravity: Qt.point(0, 0)
    }

    Item {
        id: box1
        x: window.width / 2 - width / 2
        y: window.height / 2 - height / 2
        width: 32
        height: 32

        property int sensorRadius: 128

        Box2D.Body {
            id: boxBody
            target: box1

            fixtures: [
                Box2D.Box {
                    width: box1.width
                    height: box1.height
                },
                Box2D.Circle {
                    x: box1.width / 2 - box1.sensorRadius
                    y: box1.height / 2 - box1.sensorRadius
                    objectName: boxBody.objectName + "CircleSensor"
                    radius: box1.sensorRadius
                    sensor: true

                    onBeginContact: touchIndicator.border.color = "red"
                    onEndContact: touchIndicator.border.color = "transparent"
                }
            ]
        }

        Rectangle {
            id: touchIndicator
            anchors.centerIn: parent
            width: box1.sensorRadius * 2
            height: box1.sensorRadius * 2
            color: "transparent"
            border.color: "transparent"
        }
    }

    Item {
        id: box2
        x: 100
        y: 160
        width: 32
        height: 32
        focus: true

        Keys.onSpacePressed: box2Body.linearVelocity = Qt.point(3, 0)

        Box2D.Body {
            id: box2Body
            world: physicsWorld
            target: box2
            bodyType: Box2D.Body.Kinematic

            Box2D.Box {
                width: box2.width
                height: box2.height
            }
        }
    }

    Box2D.DebugDraw {
        id: debugDraw
        world: physicsWorld
        anchors.fill: parent
        opacity: 0.75
    }
}

结果如下:

wrong

传感器未检测到移动物体。

如果我使移动物体动态化:

bodyType: Box2D.Body.Dynamic

然后检测到它:

right

这样做的正确方法是什么?

请记住:

  1. 我想让这个动作变得简单,因为我通过力量来准确地运动(因此我当前使用linearVelocity并且想要使用Kinematic)。
  2. 我不需要/需要任何实际碰撞和反弹的东西,我只需要传感器和光线投射。

1 个答案:

答案 0 :(得分:1)

运动物体具有无限质量,因此不能参与碰撞检测。要检测碰撞,其中一个物体必须为Dynamic。默认情况下,bodyType插件中的qml-box2dStatic。因此,您的场景包含2个实体 - KinematicStatic,并且传感器未检测到联系人。将boxBody.bodyType更改为Body.Dynamic可以解决问题。