libgdx - 在圆形路径中移动KinematicBody

时间:2017-09-29 07:59:04

标签: libgdx box2d

我试图在另一个身体周围实现KinematicBody的圆周运动。我尝试了这个功能:

public void updateCircular(float speed, Vector2 center){
    Vector2 radius = center.cpy().sub(this.body.getPosition());
    Vector2 force = radius.rotate90(1).nor().scl(speed);
    this.body.setLinearVelocity(force.x, force.y);
}

但它仅适用于与DynamicBody相关联的DistanceJoint。将身体类型更改为KinematicBody会改变身体的行为。身体停止在圆形轨道中移动并传递到螺旋运动(不断增加半径,就像离心力消耗它一样)。我需要尽可能多的完美圆周运动。我怎样才能做到这一点? 抱歉英语不好。

2 个答案:

答案 0 :(得分:0)

在我看来,最简单的方法是在一些静态物体和运动学体之间建立一个距离关节。这样,身体与另一个半径保持一定的半径(创建一个圆圈),然后你可以使用设定的速度来改变它的速度。

答案 1 :(得分:0)

如果旋转体必须是运动体,则为了获得具有固定半径的均匀圆周运动,我们可以添加一个垂直于速度矢量的额外速度分量。我们可以计算出旋转体与中心的距离差。可以通过将该距离除以每帧的时间步长来计算速度。每当旋转的身体向外或向内进入中心时,这将使身体向中心移动或从中心向外移动。将以下速度添加到您的计算中。

float dst=rotatingBody.getPosition().dst(pivotBody.getPosition());
//radius is the distance of center to the rotating body
float delta=dst-radius ;
//dt is time step per frame
float c2=delta/(dt); 
Vector2 centripetalVector=new Vector2(pivotBody.getPosition()).sub(rotatingBody.getPosition()).nor().scl(c2);

我写了一篇关于如何在libgdx中以运动的动态物体为中心实现旋转屏蔽的教程。可以在here中找到完整的代码。