【问题标题】:2D Ball Collisions with Corners带角球的 2D 球碰撞
【发布时间】:2010-12-29 01:45:31
【问题描述】:

我正在尝试编写从固定的垂直和水平墙壁反弹的球的 2D 模拟。模拟与墙壁表面的碰撞非常简单——只需否定垂直墙壁的 X 速度或水平墙壁的 Y 速度。问题是球也可能与墙壁的角落发生碰撞,水平墙壁与垂直墙壁相遇。我已经想出了如何检测何时发生与角落的碰撞。我的问题是球应该如何应对这种碰撞——也就是说,它的 X 和 Y 速度将如何变化。

以下是我已经知道或知道如何查找的列表:

  • 检测到碰撞时在帧中球中心的 X 和 Y 坐标
  • 球速度的 X 和 Y 分量
  • 角的 X 和 Y 坐标
  • 球的中心和角球之间的角度
  • 球在碰撞前的运动角度
  • 检测到碰撞时球与角重叠的量

我猜最好假装角是一个无限小的圆,所以我可以将球与那个圆之间的碰撞视为球与与圆相切的墙发生碰撞碰撞点。在我看来,我需要做的就是旋转坐标系与这个假想的墙对齐,在这个系统下反转球速度的 X 分量,然后将坐标旋转回原来的系统。问题是我不知道如何编程。

顺便说一句,这是一个理想的模拟。我没有考虑摩擦或球的旋转之类的东西。我正在使用 Objective-C,但我真的只是想要一个通用算法或一些建议。

【问题讨论】:

    标签: 2d collision-detection simulation


    【解决方案1】:

    如果它是一个尖锐的(没有任何圆角)直角角,它将充当retroreflector 并沿着它进入的路径反弹回来。

    【讨论】:

      【解决方案2】:

      正如您所说,您可以将角视为半径无限小的圆。在这种情况下,碰撞平面的法线由从接触点到球中心的单位向量给出:

      float nx = ballX - cornerX;
      float ny = ballY - cornerY;
      const float length = sqrt(nx * nx + ny * ny);
      nx /= length;
      ny /= length;
      

      要反映速度矢量,您可以这样做:

      const float projection = velocityX * nx + velocityY * ny;
      velocityX = velocityX - 2 * projection * nx;
      velocityY = velocityY - 2 * projection * ny;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        相关资源
        最近更新 更多