我试图在另一个身体周围实现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
会改变身体的行为。身体停止在圆形轨道中移动并传递到螺旋运动(不断增加半径,就像离心力消耗它一样)。我需要尽可能多的完美圆周运动。我怎样才能做到这一点?
抱歉英语不好。
答案 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中找到完整的代码。