【问题标题】:Actionscript collisions: solving exceptions and strange casesActionscript 冲突:解决异常和奇怪的情况
【发布时间】:2011-03-16 16:50:38
【问题描述】:

我创建了一个碰撞类来使用像素检测碰撞。在我的课堂上,我还开发了一些用于确定碰撞角度的函数。基于此,我创建了一些示例:

http://megaswf.com/serve/25437/

http://megaswf.com/serve/25436/

(改变重力的空间,右/左给球一些速度。)

您可能会注意到,发生了一些奇怪的事情:

  • 当球速很低时
  • 当球的方向是 几乎与障碍物相切。

collision http://img514.imageshack.us/img514/4059/colisao.png

上图显示了我如何计算碰撞角度。 我称红点为关键点。我搜索最大数量的关键点(通常为 4 个)。如果我发现超过 2 个关键点,我选择最远的 2 个(如其中一个蓝色对象所示)。这就是我如何找到物体碰撞表面位置的法线角度。我不知道这是否是一种过时的做事方式。

基于该角度,我旋转速度矢量来进行弹跳。

进行数学运算的代码在这里:

static public function newSpeedVector(speedX: Number, speedY: Number, normalAngle: Number): Object{
            var vector_angle: Number = Math.atan2(speedY, speedX) * (180/Math.PI);
            var rotating_angle: Number = (2*(normalAngle - vector_angle) + 180) % 360;
            var cos_ang: Number = Math.cos(rotating_angle/DEGREES_OF_1RAD);
            var sin_ang: Number = Math.sin(rotating_angle/DEGREES_OF_1RAD);
            var final_speedX: Number = speedX * cos_ang - speedY * sin_ang;
            var final_speedY: Number = speedX * sin_ang + speedY * cos_ang;

            return {x_speed: final_speedX, y_speed: final_speedY};
        }

这就是计算新速度向量的方式...

我的问题是,有没有人遇到过这种问题,或者对如何避免这种情况有一些想法?

【问题讨论】:

  • 您需要从碰撞代码中发布相关的 sn-ps

标签: actionscript-3 exception physics collision bounce


【解决方案1】:

你可以多尝试一件事,我觉得很有效。

您可以在您的游戏对象中创建诸如 getNextX() 和 getNextY() 之类的函数(当然它们会在下次更新后协调它们的位置),并根据对象的下一个位置而不是当前位置来检查对象的碰撞。

这样,对象将永远不会重叠,您将知道它们何时将发生碰撞并优雅地应用您的碰撞后物理!

【讨论】:

    【解决方案2】:

    没有看到你的代码,这是我能提供的最好的。

    碰撞物理应该有一些被认为是“停止”的速度阈值。也就是说,一旦速度变得足够小,您应该明确地将对象标记为停止并将其从碰撞代码中排除。这将有助于稳定缓慢移动的物体。良好的阈值需要反复试验。

    当发生碰撞时,重要的是至少要尝试纠正任何相互渗透。这很可能是切线碰撞行为异常的原因。尝试以合理的方式将碰撞的物体从它撞击的物体上移开。

    您确定法线的方法应该可以正常工作。游戏物理就是作弊(以一种看起来还不错的方式作弊)。我认为旋转和摩擦不是你想要的一部分?

    试试这个。你有正常的联系。当您检测到碰撞时,计算穿透深度并沿着法线移动您的对象,这样就不再穿透了。您可以使用您已经计算的两个点来获得一个穿透点,但您需要计算另一个。对于圆很容易(中心点+法线方向的半径)。有更复杂的方法可以解决这个问题,但看看简单的方法是否适合您。

    我已阅读并推荐这本书:Game Physics Engine Development

    【讨论】:

    • 关于小速度问题,是的,我知道我必须定义一个不同于 0 的最小速度。但如果我这样做,球会穿透墙壁。所以这只是将球保持在墙外的问题......
    • 您好,感谢您的帮助。我会尽可能给你一些选票。我想没有有效的方法来计算一般形状的穿透深度。无论如何,我这样做是为了学习,所以我可能会继续前进......也许会找到一个看起来很糟糕的作弊方法,只是为了让事情远离墙壁。关于轮换,这也是我想了解的事情之一。也许现在,也许以后。摩擦可能相对简单。但是,嘿,我不打算建造自己的引擎,至少现在是这样。即使认为这是一个对未来有吸引力的项目。可惜我的物理背景不是很好!
    • 我在本科阶段已经学习了一年物理,但一些 3D 游戏物理的东西仍然在我的脑海中。但是游戏物理的好处是你可以通过非常简单的规则获得非常棒的东西。对于您的演示,您可以简单地给每个对象一个半径,即使它不是一个圆。错在太大的一边。那至少应该给你一些东西。我确信存在可以准确计算它的算法。我知道有 3D 的(在我提到的书中)。
    【解决方案3】:

    我做了一些类似的事情并遇到了类似的问题。 我所做的是,当弹跳物体(在您的情况下为球)的像素与障碍物的像素重叠时,您需要将球移出障碍物,以免它们重叠。

    假设球在障碍物上滚动,在再次渲染球之前,您需要将球向后移动“重叠”量。如果您知道球以什么角度撞击障碍物,只需将其沿该角度移出即可。

    您还需要添加一些阻尼,否则球将永远不会停止。取一个(非常)小的值,如果球速度低于该值,则将速度设置为 0。

    【讨论】:

    • 但是我让球回退多少像素?原因可以说:让它回去,直到它不再接触表面。但是要知道这需要一次移动一个像素并检查它是否已经不接触......这对 CPU 来说是一个非常密集的过程。让我知道我是否在您的回答中感到愚蠢或误解了某些内容.. :) 谢谢。
    • 您拥有计算必须离开“墙”多远所需的所有变量。首先找到两个“关键点”之间的中心点。然后测量从球中心到该点的距离。然后从你的球半径减去那个距离,你就得到了将球移开所需的距离。然后,您只需要获得将其移入的角度即可。
    • 在这种情况下,您可能需要添加不同类型的碰撞处理程序,具体取决于它与什么障碍物碰撞的对象。我已经阅读了这本书的一些内容,它可能是您需要的:ebookpdf.net/__real-time-collision-detection-ebook_ebook_.html 尝试制作一个处理所有类型碰撞的通用函数可能不是一个好主意。但是,如果您知道发生碰撞时对象重叠的程度,则需要将对象沿相反方向向后移动重叠向量的大小。
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2021-11-27
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多