【问题标题】:Detect collision between a moving object and an immobile one检测运动物体和静止物体之间的碰撞
【发布时间】:2010-07-07 14:01:49
【问题描述】:

首先,我的问题并不是特定于 C# 或 XNA,但我的代码示例将使用这些。

我目前正在尝试制作 Pong 克隆,但遇到了碰撞检测问题。

每个对象基本上都有一个特定的 Velocity(它是 Vector2)、Position(Vector2,也是)和 Speed(只是一个浮点数)。在对象的每次 Update() 调用中,位置都会以这种方式更改:

Velocity.Normalize();
Position += Velocity * Speed;

起初,我只通过来自对象矩形的简单 Intersects() 调用检查当前是否存在两个对象之间的碰撞。我很快意识到,我不仅可以检查对象是否当前与另一个对象发生碰撞,还可以检查对象是否碰撞与途中的对象。当速度太高时,只检查两个物体是否正在碰撞,让球通过桨。

我尝试了不同的方法来解决问题,但似乎都没有奏效。我只需要一种方法来检查两个物体是否在途中发生碰撞,如果发生碰撞,是否来自水平、垂直或两者(以相应地改变球的速度)。

我不一定要马上得到解决方案,也许只是如何实现这个的基本想法,我会自己编写代码。

感谢您的宝贵时间。

【问题讨论】:

    标签: c# xna collision-detection


    【解决方案1】:
    【解决方案2】:

    作为起点,请看这里。

    http://www.flipcode.com/archives/Theory_Practice-Issue_01_Collision_Detection.shtml

    这是对所有不同碰撞方式的很好的介绍。也许你的情况在这里解释。

    【讨论】:

    • 谢谢,我一定会看看的! :)
    【解决方案3】:

    我认为这个链接:http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php 可能是您正在寻找的。它描述了球面扫描测试,当您有快速移动的物体可能在一帧间隔内穿过一个平面时很有用。

    它还为您提供交点,您可以使用它来反映您关于平面法线的轨迹并继续对象的路径。

    【讨论】:

      【解决方案4】:

      您的问题是,如果一个对象太快,它可能会在检测调用 Update() 之前通过不动的对象(就像它通过不动的对象一样)。

      以速度大小沿移动向量扩展对象的形状: 正方形[0,0][2,2] 和速度[1,0] 和速度10 将创建一个矩形[0,0][12,2] => 它现在定位在坐标[0,0] 和大小[12,2]

      现在将矩形与固定对象相交。现在你知道它们是否碰撞了。

      【讨论】:

      • 这是一个聪明的解决方案,应该得到更多的爱
      【解决方案5】:

      如果两个点对象的位置相同,那么它们就发生了碰撞。

      【讨论】:

      • 我不认为这很简单。很少有图形只有一点大小。
      • 如果两个圆形物体在它们的半径之和内,那么它们发生了碰撞。
      • 想象你有一堵 2 个单位宽的墙和一个直径为 1 个单位的球。如果球距离墙壁 2 个单位,并且以每帧 6 个单位的速度移动,则在其下一次更新中,它的起始位置和结束位置都不会与墙壁“碰撞”,但确实发生了碰撞放置在球运动的一部分。这就是 XGhost27X 所要求的。
      • 比较每个像素似乎是一堆额外的开销
      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多