确定墙体碰撞的结果角度


14

因此,我有一个对象朝固定的水平或垂直墙方向移动。如何计算物体应反弹的角度?物体可以任意角度接近墙壁。

Answers:


18

如果您知道墙的法线向量并且有对象的进入方向,那么您想要的是向量在平面上反射

如果n是归一化向量,并且v入射方向,则您需要的是-(2(n · vn - v)。负号说明了这样一个事实,即反射公式实际上并未使方向反向,因为对象的速度会反向。

这个答案是根据矢量数学而不是角度给出的,因为如果您没有明确的理由使用角度,通常这是更可取的。请注意,如果您必须谈论角度,则反射角度等于入射角度。如果从法线测量角度,则出射角为入射角的负数;如果角度是从墙测量的,那么它就是入射角的补码。


很好的解释。对我来说效果很好!谢谢!
DRiFTy 2012年

13

您没有指定是2D还是3D游戏。但是,如果它是2D游戏,并且您的墙保证是水平或垂直的,而您只想从其上弹开物体,则比处理反射要容易得多。

碰到垂直壁时,只需否定对象速度的X分量,或碰到水平壁时就可以否定对象速度的Y分量。例:

if( /* hit vertical wall */ )
{
    object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
    object.velocity.y *= -1;
}

但是,如果您真的很想知道角度,那么一般而言,反射角与入射角相同。该角度是相对于墙的法线测量的。这是一张清晰的图片:

在此处输入图片说明

如果您需要为任意墙处理此问题,则需要研究如何反射向量。它实际上只是一个小公式,它接受墙的法线和入射向量,并为您返回反射向量。这是XNA使用的公式:

public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
    return vector - 2 * Vector3.Dot(vector, normal) * normal;
}

对于2D,您可以执行以下操作:

public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
    return vector - 2 * Vector2.Dot(vector, normal) * normal;
}

抱歉,这是2D游戏。我想保持角度,因为就像您说的那样,我希望能够使用任何墙。谢谢!
DRiFTy 2012年

我也对其进行了编辑以涵盖2D。实际上,它是相同的,只是2D向量,相同的运算和公式
Gustavo Maciel 2012年

2D游戏中的墙可能是倾斜的,因此该说法if it's a 2D game and your walls are guaranteed to be horizontal or vertical不正确。答案的第二部分说明了正确的实现。恕我直言,零件的顺序应该颠倒,首先提出一般性解决方案,并以强调的方式提出,而为特殊情况下的简化方案则提出直角解决方案。
XenoRo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.