Контакт датчика с кинематическим и динамическим светильниками

77
6

Я пытаюсь обнаружить движущийся объект, добавив датчик к неподвижному объекту. 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

Каков правильный способ сделать это?

Пожалуйста, имейте в виду, что:

Я хочу, чтобы движение было простым, потому что я сосать точное движение через силы (отсюда мой текущий подход с linearVelocity и желание использовать Kinematic). Я не хочу/не нуждаюсь в чем-либо, чтобы на самом деле сталкиваться и отскакивать от всего остального, мне просто нужны датчики и лучей.

спросил(а) 2021-01-25T17:05:36+03:00 4 месяца, 4 недели назад
1
Решение
63

Кинематическое тело имеет бесконечную массу, поэтому оно не может быть задействовано при обнаружении столкновения. Чтобы обнаружить столкновение, один из тел должен быть Dynamic. По умолчанию bodyType в qml-box2d является Static. Таким образом, ваша сцена содержит 2 тела - Kinematic и Static а датчик не обнаруживает контакты. Изменение boxBody.bodyType для Body.Dynamic решает проблему.

ответил(а) 2021-01-25T17:05:36+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема