Я пытаюсь обнаружить движущийся объект, добавив датчик к неподвижному объекту. 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
}
}
Это результат:
Датчик не обнаруживает движущийся объект.
Если я движущийся объект динамический:
bodyType: Box2D.Body.Dynamic
тогда обнаруживает его:
Что такое правильный способ сделать это?
Пожалуйста, имейте в виду, что:
- Я хочу, чтобы держать простое движение, потому что я сосу при аккуратном движении через силы (отсюда мой текущий подход с
linearVelocity
и желая использоватьKinematic
). - Я не хочу/нуждаюсь в чем-либо, чтобы фактически столкнуться с чем-либо другим, и мне нужно только датчики и лучирование.
Кинематическое тело не имеет массы, поэтому оно не связано с обнаружением столкновения. Box2D просто не может вычислить подпрыгивание и все об этом. Кинематические тела в основном предназначены для статических структур. – folibis
http://www.iforce2d.net/b2dtut/bodies говорит, что кинематические тела могут двигаться, а пример на [это] (http://www.emanueleferonato.com/2012/05/11/understanding-box2d-kinematic -bodies /) показывает, что они сталкиваются с динамическими объектами. Вы уверены, что их нельзя использовать так, как я их пытаюсь использовать? – Mitch
Да, кинематические тела не подвержены силе. Box2D реализует физику Ньютона, и поэтому тела с бесконечной массой (например, кинематические) не могут быть задействованы в обнаружении столкновений. Если вы стреляете, избегайте столкновения (просто действуйте как датчик), вы можете играть с «Fixture.categories» и «Fixture.collidesWith», как в одном из примеров. Я не помню, кто из них. – folibis