2016-12-30 4 views
2

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

Кинематическое тело не имеет массы, поэтому оно не связано с обнаружением столкновения. Box2D просто не может вычислить подпрыгивание и все об этом. Кинематические тела в основном предназначены для статических структур. – folibis

+0

http://www.iforce2d.net/b2dtut/bodies говорит, что кинематические тела могут двигаться, а пример на [это] (http://www.emanueleferonato.com/2012/05/11/understanding-box2d-kinematic -bodies /) показывает, что они сталкиваются с динамическими объектами. Вы уверены, что их нельзя использовать так, как я их пытаюсь использовать? – Mitch

+0

Да, кинематические тела не подвержены силе. Box2D реализует физику Ньютона, и поэтому тела с бесконечной массой (например, кинематические) не могут быть задействованы в обнаружении столкновений. Если вы стреляете, избегайте столкновения (просто действуйте как датчик), вы можете играть с «Fixture.categories» и «Fixture.collidesWith», как в одном из примеров. Я не помню, кто из них. – folibis

ответ

1

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

Смежные вопросы