反射角度


11

我有这个“突破风格”的游戏。

我在中心有一门大炮,大炮周围有方块,方块周围有护垫。游戏外观如下:

圆形突破游戏

我设法获得了每个像素的碰撞,并且我的球在与块接触时通过以下数学运算“ 反映 ”:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

描绘反射角计算的图像

蓝线是球的方向,黑线(基线)是块的表面。

方向是以弧度表示的角度(当然可以转换为度)。
球通过以下方式移动:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

到目前为止,一切都很好。

我的问题现在出在垫子上(小彩色块周围的3个深色大块)。

当它们转过来时,表面角度会发生变化。
不仅如此,球也应该击打侧面,那么,如何测量击球的方向和球的新运动方向呢?

ps:如果需要,我可以提供代码和可播放的swf。


编辑

好的,角度问题已通过Vectors解决,但侧面和后部碰撞仍然存在问题。

我将为此打开另一个问题,并将其链接到此处。


3
如果您重新关联帐户,则应该获得+100声誉加值。它应该是您个人资料的“帐户”标签中的一个选项。不过,与此同时,我会为您发布这些图片。
恩典笔记

我收集到您的“方向”是介于0到360之间的角度,并且要使用三角函数来移动球?
乔纳森·康内尔

@Grace,非常感谢您提供的图像... @ 3nixios,我添加了有关角度和运动的更多信息。
NemoStein 2011年

如果每个块仅存储一个“方向”,则可能会将每个黑色块重新想象成四个单独的块的组,其中“方向”面始终朝外。在四个角落可能会有边缘情况。
horatio 2011年

Answers:


8

我不确定我是否正确理解了您的问题,但是我认为您要做的就是找到碰撞后球的合成方向。

这是我白板上的一张快速绘图,显示了可能的解决方案:

在此处输入图片说明

绿色箭头代表球的速度(作为矢量),蓝色箭头代表您的大黑色块,红色箭头代表合成的矢量。

在第一种情况下,蓝色块的倾斜度为30度。解决碰撞问题的方法之一是将所有内容恢复到水平轴上。您需要做的是将所有内容旋转 30度(块的倾斜度)(您可以使用矩阵)。

然后,您检查碰撞的来源。如果碰撞是水平的,则反转速度的x分量。如果它是垂直的(如本例所示),则为y分量(ball.Velocity.Y = -ball.Velocity.Y)。这也将使球在碰到角时正确动作(这将使两个组件反向)。之后,您只需要旋转回到实际情况(不在图形上)。

在第二种情况下,除了球的速度不垂直于方块外,其他都是相同的。旋转70度,检查碰撞的来源,然后反转适当的组件。之后,您旋转回到实际情况。

注意:我注意到您使用的是角度而非矢量来表示方向。您可以为这些计算创建一个矢量,或者保持相同的基本思想,但要使用角度。

当然,这不是最好的方法,我相信您可以通过某种方式进行计算,但是我认为这可能是解决您的问题的方法。


谢谢...爱你的董事会。我会等一下... Ahn,您是否认为向量可以更好地维护/使用?
NemoStein 2011年

哈哈原谅我糟糕的绘画技巧。
杰西·埃蒙德

糟糕,我实际上在绘图时忘记了重要的一步。。您需要旋转回去-block inclination angle以具有适当的碰撞响应。
杰西·埃蒙德

我想这与个人喜好有关,但我更喜欢矢量。您只是不必在大多数时间考虑它们背后的数学运算,这通常会使代码更简洁。因此,您可以Direction像这样保持一个(作为矢量)并更新球的位置:ball.Position += ball.Direction * ball.Speed;
杰西·埃蒙德

@Jesse,直到现在我还是无法做到这一点。我完全了解您的方法,但是无法实现。为此,我需要重写使用弧度角来使用矢量的整个部分(实际上并不多)。现在,我将尝试其他替代方法,如果您还有其他替代方法,我将很高兴尝试。谢谢。
NemoStein 2011年
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.