Box2d 设置变换

Box2d setTransform

场景设置: • 我们的环境:LibGdx Android & iOS //如果你不知道LibGdx,没关系,只要知道这个程序是为[=26=构建的] 和 Android

• 我们的屏幕上什么都没有,只有一个 Box2d 圆圈

好的,那么,我需要做什么? 我需要让我的 Box2d Circle 到 "teleport" 到屏幕被点击的地方...但我需要它有一定的速度所以如果它与其他东西碰撞它会把另一个物体扔出去顺其自然。

我目前正在使用 body.setTransform() 但我没有速度,人们说它有很多问题。

我该怎么做?谢谢!

setTransform 方法本身不是错误。 它可能会因为忽略在:

时出现的物理现象而引起一些麻烦
  • 使用关节 - 关节提供了一些约束,这种"violent"改变会使身体表现得很奇怪
  • 存在碰撞 - 因为转换后的body可以"pushed"变成其他的body

您描述的情况完全是使用 setTransform 时的典型情况,我看不出有什么理由害怕它。你在这里也不需要任何速度。


但是,如果您决定更改 "teleporting" 机制以应用速度将 object 移动到世界点,您应该:

  • 通过减去目标位置和body位置计算速度矢量

    Vector2 velocity = target.sub( body.getPosition() ) ); //where target is Vector2 of touched point
    
  • 我想将速度限制在某个最大值如果你需要(这是可选的)

    //optional
    velocity.nor();
    velocity.mul( MAX_VALUE ); //MAX_VALUE is a float
    
  • 设置速度为body

    body.setLinearVelocity( velocity );
    
  • 添加到主循环(渲染方法)检查​​ body 是否在目标位置(或在某个范围内 - 由于精确度,它精确地在目标位置的可能性很小如果你会限制速度 - 如果不是我想它应该在 world.update() )

    的一次迭代后处于目标位置
    if( body.getPosition().sub( target ).len() < SOME_PRECISION )
    {
        body.setLinearVelocity( new Vector2(0, 0) );
    }
    

您也可以看看 Box2D MouseJoint,虽然我从来没有使用过它,因此无法在此处提供任何提示。