gpt4 book ai didi

c# - 碰撞后释放卡住的物体

转载 作者:行者123 更新时间:2023-11-30 17:37:36 24 4
gpt4 key购买 nike

我的游戏引擎中的碰撞解决方案遇到了一个小问题。如果两个物体碰撞并且碰撞导致速度变为零,则物体的边缘将相互重叠并且它们将被卡住。

有没有办法为这种情况实现一个包罗万象?即,将物体沿正确的方向移动得足够多,这样它们就不会卡住。

这是我检查碰撞和移动物体的方式。在实体上调用更新时,它会移动 (x,y)。

    public static void Update()
{
for (var iterator = 0; iterator < PhysicsEntities.Count; iterator++)
{
for (var index = iterator + 1; index < PhysicsEntities.Count; index++)
{
if (!Collision.ResolveCollision(PhysicsEntities[iterator],
PhysicsEntities[index], Detection)) continue;
PhysicsEntities[iterator].Update();
PhysicsEntities[iterator].Collided = true;
PhysicsEntities[index].Update();
PhysicsEntities[index].Collided = true;
}
}

foreach (var entity in PhysicsEntities)
{
entity.Update(velocity: true);
entity.Collided = false;
}
}
}

这是实体的更新函数:

public void Update(bool velocity = false)
{
if(!Movable) return;
if (!Collided)
{
var moveX = Velocity.X / Universe.UpdateInterval;
var moveY = Velocity.Y / Universe.UpdateInterval;
Position.Move(moveX, moveY);
BoundingBox.Move(moveX, moveY);
}
if(velocity) UniversalForces();
}

private void UniversalForces()
{
Velocity.Scale(1 - Universe.Friction);
Velocity.Add(Universe.GravityMag, Universe.GravityDir);
}

最后,这是一张对象卡住的模拟图像。如您所见,只是边缘被卡住了:

enter image description here

最佳答案

快速的解决方案是将两个对象移回前一个抽动点的位置,并将引起碰撞的任何其他对象也移回。它有效,但它看起来很乱,并导致一些看起来非常糟糕的行为——比如直接推墙会留下一个缝隙,但向墙倾斜会留下一个更小的缝隙。很乱。

更好的解决方案是将两个物体沿着它们的负速度矢量向后移动足够远,这样它们就不再接触了。通常一些点积数学可以为您提供所需的东西,尽管向后迭代可以工作(慢)。

长话短说,永远不要让对象重叠。防患于未然,避免卡住的紧张、无法移动东西等。

关于c# - 碰撞后释放卡住的物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com