3d墙壁滑动碰撞
本文关键字:碰撞 3d | 更新日期: 2023-09-27 18:27:30
我正在处理游戏中的墙壁碰撞问题,而我目前的情况是,我被困在了墙上。我试图让我的角色在墙上滑动,但仍然会发生碰撞。
我的角色离开了我使用他所面对的角度创建的向量。
这是我的碰撞函数:
private static bool CheckForCollisions(ref Crate c1, ref Player c2,bool direction)
{
for (int i = 0; i < c1.model.Meshes.Count; i++)
{
// Check whether the bounding boxes of the two cubes intersect.
BoundingSphere c1BoundingSphere = c1.model.Meshes[i].BoundingSphere;
c1BoundingSphere.Center += c1.position + new Vector3(2, 0, 2);
c1BoundingSphere.Radius = c1BoundingSphere.Radius / 1.5f;
for (int j = 0; j < c2.model.Meshes.Count; j++)
{
BoundingSphere c2BoundingSphere = c2.model.Meshes[j].BoundingSphere;
if (direction)
c2BoundingSphere.Center += c2.position + new Vector3(c2.getPlannedDirection().X, 0, 0);
else if (!direction)
c2BoundingSphere.Center += c2.position + new Vector3(0, 0, c2.getPlannedDirection().Y);
//c2BoundingSphere.Center += c2.position;
if (c1BoundingSphere.Intersects(c2BoundingSphere))
{
return true;
}
}
}
return false;
}
这是我的更新:
for (int x = 0; x <= 29; x++)
{
for (int y = 0; y <= 29; y++)
{
if (crate[x, y].getType() == 11 && collisionEnabled)
{
if (CheckForCollisions(ref crate[x, y], ref player,true))
{
player.clearPlannedDirectionX();
//Console.Write(player.getPosition().X + "," + player.getPosition().Y + "," + player.getPosition().Z);
//movePlayer = false;
}
if (CheckForCollisions(ref crate[x, y], ref player,false))
{
player.clearPlannedDirectionZ();
//Console.Write(player.getPosition().X + "," + player.getPosition().Y + "," + player.getPosition().Z);
//movePlayer = false;
}
}
}
}
这看起来应该在gamedev堆栈交换中,我建议切换到射线测试而不是sphere。
无论如何,如果你嫁给了你的基于球体的系统,你可以把玩家"推出"墙:
private static bool CorrectCollisions(ref Crate c1, ref Player c2)
{
for (int i = 0; i < c1.model.Meshes.Count; i++)
{
// Check whether the bounding boxes of the two cubes intersect.
BoundingSphere c1BoundingSphere = c1.model.Meshes[i].BoundingSphere;
c1BoundingSphere.Center += c1.position + new Vector3(2, 0, 2);
c1BoundingSphere.Radius = c1BoundingSphere.Radius / 1.5f;
for (int j = 0; j < c2.model.Meshes.Count; j++)
{
BoundingSphere c2BoundingSphere = c2.model.Meshes[j].BoundingSphere;
c2BoundingSphere.Center += c2.position;
Vector3 dir=c2BoundingSphere.Center - c1BoundingSphere.Center;
float center_dist_sq=dir.dot(dir);
float min_dist=c2BoundingSphere.Radius+c1BoundingSphere.Radius;
if (center_dist_sq < min_dist*min_dist) {
dir.normalize();
c2.position += dir*(min_dist-sqrt(center_dist_sq));
}
}
}
return false;
}
然后你的更新看起来更像:
for (int x = 0; x <= 29; x++) {
for (int y = 0; y <= 29; y++) {
if (crate[x, y].getType() == 11 && collisionEnabled) {
CorrectCollisions(ref crate[x, y], ref player);
}
}
}
我不确定(2,0,2)向量或2/3向量的目的是什么……我只是忽略了它们来表达的概念