Farseer:对象不会从静态对象反弹回来

时间:2013-12-04 03:20:19

标签: c# xna farseer

我有一个动态圆形对象,它位于四个静态矩形对象中。考虑一个盒子里面的球,静态矩形物体模拟盒子的墙壁。对于圆形对象,IgnoreGravity设置为true。我希望圆形物体能够从墙壁上弹回来。然而,当圆形物体与墙壁碰撞时,它会粘在墙上并沿着墙壁移动而不是反弹。

以下是我正在使用的代码:

Body CircleBody;

const int CircleRadiusInPixels = 20;
const int CircleCentreXInPixels = 100;
const int CircleCentreYInPixels = 100;
Texture2D CircleTexture;

Body[] RectangleBody;
Texture2D RectangleTexture;

struct RectagleProperties
{
    public int WidthInPixels;
    public int HeightInPixels;
    public int CenterXPositionInPixels;
    public int CenterYPositionInPixels;

    public RectagleProperties(int Width, int Height, int X, int Y)
    {
        WidthInPixels = Width;
        HeightInPixels = Height;
        CenterXPositionInPixels = X;
        CenterYPositionInPixels = Y;
    }

};

RectagleProperties[] rectangleProperties;

World world;

const float PixelsPerMeter = 128.0f;
float GetMetres(int Pixels)
{
    return (float)(Pixels / PixelsPerMeter);
}

int GetPixels(float Metres)
{
    return (int)(Metres * PixelsPerMeter);
}



protected override void LoadContent()
{
    ...
    RectangleTexture = Content.Load<Texture2D>("Sprites/SquareBrick");
    CircleTexture = Content.Load<Texture2D>("Sprites/Circle");

    world = new World(new Vector2(0, 9.8f));

    CircleBody = BodyFactory.CreateCircle(world, GetMetres(CircleRadiusInPixels), 
                                          1, 
                                          new Vector2(
                                                GetMetres(CircleCentreXInPixels), 
                                                GetMetres(CircleCentreYInPixels)));
    CircleBody.BodyType = BodyType.Dynamic;
    CircleBody.IgnoreGravity = true;
    CircleBody.LinearVelocity = new Vector2(1, 1);

    rectangleProperties = new RectagleProperties[4];
    rectangleProperties[0] = new RectagleProperties(800, 20, 400, 10);
    rectangleProperties[1] = new RectagleProperties(800, 20, 400, 460);
    rectangleProperties[2] = new RectagleProperties(20, 480, 10, 240);
    rectangleProperties[3] = new RectagleProperties(20, 480, 790, 240);

    RectangleBody = new Body[4];
    for (int i = 0; i < rectangleProperties.Length; i++)
    {
        RectangleBody[i] = BodyFactory.CreateRectangle(world,
                                                       GetMetres(rectangleProperties[i].WidthInPixels),
                                                       GetMetres(rectangleProperties[i].HeightInPixels),
                                                       0.5f,
                                                       new Vector2(GetMetres(rectangleProperties[i].CenterXPositionInPixels),
                                                                   GetMetres(rectangleProperties[i].CenterYPositionInPixels)));
        RectangleBody[i].BodyType = BodyType.Static;

    }
    ....
}

经过一番挖掘后,我发现VelocityConstraint导致碰撞被视为无弹性。但是,如果我减少VelocityConstraint的值,则会导致奇怪的碰撞响应。

有人知道如何在与静态物体碰撞后让球对象反弹吗?

1 个答案:

答案 0 :(得分:0)

由于你没有发布问题可能存在的Update-method的内容,我将做出合格的猜测。

这似乎与一个非常常见的问题有关:

假设圆形物体具有一定的速度。 如果发生碰撞,您可以在墙轴上反转速度,速度会因重力或其他原因而减小。

现在你应用新的速度来解决碰撞,但由于速度降低,解决碰撞是不够的,这意味着在下次更新时物体仍然会与墙碰撞。

这将导致速度反复反转,因为物体永远无法获得足够的速度来再次脱离碰撞。

解决这个问题的方法是在继续使用其他代码之前,最好在最短的轴上将对象移出碰撞(查看“分离轴定理”)。