首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在XNA中通过滑动平面进行碰撞检测

在XNA中通过滑动平面进行碰撞检测
EN

Stack Overflow用户
提问于 2011-01-15 02:51:53
回答 2查看 3K关注 0票数 6

我正在尝试为我正在制作的一个自定义的“我的世界”客户端设计一个碰撞检测算法。基本上,整个世界是由立方体组成的,玩家(或相机)需要能够站在这些立方体上移动。我想要的结果如下图所示:

绿线是玩家的移动矢量。当玩家与其中一个立方体的平面擦肩而过时,我希望向量变为与平面垂直的向量。然而,矢量应该保持它在平面方向上的所有速度,同时失去朝向平面的所有速度。

我希望我的问题已经说得很清楚了。实现这样的碰撞检测系统的最佳和最有效的方法是什么?另外,像这样的系统会允许一个简单的重力分量吗?

编辑:忘记提到,立方体存储在一个三维数组中,x,y,z。

EN

回答 2

Stack Overflow用户

发布于 2011-01-15 03:03:36

实现这一点的一种简单方法是检测球和平面的碰撞。计算穿透深度,这是球实际穿过平面的距离,并将球推回平面的法线方向。

这将具有将球放置在平面表面上的效果。如果对每个帧执行此操作,球将有效地沿平面滑动,当然,假设球的速度向量与平面的法线不平行。

碰撞检测的领域既大又复杂,根据您的游戏,您必须根据您需要的真实感级别和性能要求来确定什么才能满足您的需求。你应该总是选择最简单的解决方案,给出足够现实的反馈,这取决于游戏通常不一定是完美的。

基本上,您应该将碰撞检测分为两个阶段,通常称为宽阶段和窄阶段。

宽阶段可以像执行快速边界框检查以确定潜在冲突一样简单,然后将这些潜在冲突提交给窄阶段冲突检测,以执行更详细的检查,其中您可以确定是否确实存在冲突和冲突深度。如果您有许多对象,那么宽泛的阶段可能会使用某种类型的四叉树索引,以仅选择对象附近的块来执行碰撞检测。

票数 1
EN

Stack Overflow用户

发布于 2011-01-16 04:40:10

在轴对齐立方体的世界中,这真的很容易。很容易认为你需要一些精致的东西,但实际上它真的很简单。这是在写完我自己的“我的世界”之后的经验。

下面是操作步骤:

代码语言:javascript
运行
复制
position.X += velocity.X;
if(colliding())
  position.X -= velocity.X;

position.Y += velocity.Y;
if(colliding())
  position.Y -= velocity.Y;

position.Z += velocity.Z;
if(colliding())
  position.Z -= velocity.Z;

以下是用于确定是否发生碰撞的代码:

代码语言:javascript
运行
复制
bool colliding()
{
  int minX = Position.X - size.X / 2;
  int minY = Position.Y - size.Y / 2;
  int minZ = Position.Z - size.Z / 2;

  int maxX = Position.X + size.X / 2;
  int maxY = Position.Y + size.Y / 2;
  int maxZ = Position.Z + size.Z / 2;

  for (int x = minX; x <= maxX; x++)
    for (int y = minY; y <= maxY; y++)
      for (int z = minZ; z <= maxZ; z++)
      {
        if(blockType[x, y, z] != 0)
          return true;
      }

   return false;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4694759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档