Box2d setTransform

问题描述 投票:0回答:2

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

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

好的,那我需要做什么呢? 我需要让我的 Box2d Circle “传送”到屏幕被点击的位置...但我需要它有一定的速度,这样如果它与其他物体发生碰撞,它就会把另一个物体扔到一边。

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

我该怎么做?谢谢!

java android ios libgdx box2d
2个回答
3
投票

setTransform方法本身没有问题。 由于忽略物理原理,可能会导致一些麻烦,这些问题可能会在以下情况出现:

  • 使用关节 - 关节提供了一些约束,这种“暴力”的变化会让身体表现得很奇怪
  • 碰撞存在 - 因为变形后的物体可以被“推”到其他物体中
您描述的情况完全是使用

setTransform 时的典型情况,我认为没有理由害怕它。您在这里也不需要任何速度。


但是,如果您决定更改“传送”机制以应用速度将对象移动到世界点,您应该:

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

    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.setLinearVelocity( velocity );
    
    
  • 添加到主循环(渲染方法)检查身体是否处于目标位置(或在某个范围内 - 由于精度的原因,如果你限制速度,它精确地到达目标的可能性很小 - 如果不是,我猜它是在 world.update() 迭代一次后应该位于目标位置)

    if( body.getPosition().sub( target ).len() < SOME_PRECISION ) { body.setLinearVelocity( new Vector2(0, 0) ); }
    
    
你也可以看看 Box2D

MouseJoint 虽然我从来没有使用过这个并且不能在这里提供任何提示。


0
投票

setTransform() 代码放入 LibGDX Gdx.app.postRunnable() 方法中:

Gdx.app.postRunnable { body.setTransform(10f, 10f, 0f) }
    
© www.soinside.com 2019 - 2024. All rights reserved.