我有一个动态圆形对象,它位于四个静态矩形对象中。考虑一个盒子里面的球,静态矩形物体模拟盒子的墙壁。对于圆形对象,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
的值,则会导致奇怪的碰撞响应。
有人知道如何在与静态物体碰撞后让球对象反弹吗?
答案 0 :(得分:0)
由于你没有发布问题可能存在的Update-method的内容,我将做出合格的猜测。
这似乎与一个非常常见的问题有关:
假设圆形物体具有一定的速度。 如果发生碰撞,您可以在墙轴上反转速度,速度会因重力或其他原因而减小。
现在你应用新的速度来解决碰撞,但由于速度降低,解决碰撞是不够的,这意味着在下次更新时物体仍然会与墙碰撞。
这将导致速度反复反转,因为物体永远无法获得足够的速度来再次脱离碰撞。
解决这个问题的方法是在继续使用其他代码之前,最好在最短的轴上将对象移出碰撞(查看“分离轴定理”)。