当前位置:  开发笔记 > 编程语言 > 正文

如何计算弹跳角度?

如何解决《如何计算弹跳角度?》经验,为你挑选了5个好方法。

我玩了一会儿,但我简直无法理解.

我制造了一个发射导弹的坦克,当导弹击中墙壁时,我希望它们反弹,但我希望它们能够以正确的角度反弹.

现在我没有任何障碍,当导弹越过viewportRectangle我制造的时候导弹就会反弹.

我正在寻找的解决方案是否相当先进?

有相对简单的方法吗?



1> Gareth Rees..:

您可能会认为,因为您的墙与坐标轴对齐,因此编写特殊情况代码是有意义的(对于垂直墙,否定速度的x坐标;对于水平墙,否定速度的y坐标) ).然而,一旦你让游戏在垂直和水平墙壁上运行良好,你可能接下来会想到的是,"任意角度的墙壁怎么样?" 所以从一开始就值得考虑一般情况.

在一般情况下,假设您的导弹具有速度v并且击中具有表面法线n的墙壁.

导弹与矢量v即将倾斜击中一个表面正常n的墙.

分裂v成成分ù垂直于壁和瓦特平行.

直角三角形,斜面为v,短边u平行于墙壁,长边w平行于墙壁.

哪里:

u =(v  ·  n/n  ·  n)n
w = v - u

这里,v  ·  n是向量vn的点积.请参阅链接以获取有关如何计算它的说明.点积n  ·  n评估法向量长度的平方; 如果你总是以单位向量的形式保持法线,则n  ·  n = 1,你可以省略除法.

在弹跳之后,平行于壁的运动分量受到摩擦力f的影响,并且垂直于壁的分量受到弹性的影响,弹性可以以恢复系数 r的形式给出.

所以碰撞后的速度是v' = f w - r u.在一个完全弹性,无摩擦的碰撞中,v' = w - u ; 也就是说,运动反映在碰撞点的法线上,如比尔答案中给出的图表所示.

这种方法在三个维度上的工作方式也相同.

(显然这是一个非常简化的弹跳概念;它不考虑角动量或变形.但对于许多种类的视频游戏来说,这种简化是完全足够的.)


我同意从纵向和横向墙的特殊情况编码开始是错误的方法.它不是正确路线的垫脚石,而是一条死路.

2> Bill the Liz..:

我认为更简单的方法是使用导弹的速度而不是计算角度.假设你的导弹具有xVelocity并且yVelocity可以水平和垂直地表示其运动.这些速度可以是正的或负的,以表示左,右,上或下.

如果导弹击中顶部或底部边界反转的标志yVelocity.

如果导弹击中左侧或右侧边界,则反转该标志xVelocity.

这将使相反轴的运动保持不变.

从ChrisF的回答中借用图像,让我们说导弹从位置I开始.

反射角度

xVelocityyVelocity两者均为正(在2D图形向右和向下通常为正)的导弹将在所指示的方向行进.让我们只分配值

xVelocity = 3
yVelocity = 4

当导弹击中位置C处的墙壁时,它xVelocity不应该改变,但是它yVelocity应该反转到-4,以便它向上行进,但是向右移动.

这种方法的好处是,你只需要跟踪导弹的的xPosition,yPosition,xVelocity,和yVelocity.仅使用这四个组件和游戏的更新速率,导弹将始终重新绘制在正确的位置.一旦你进入更加复杂的障碍物,这些障碍物不是直角或正在移动,使用X和Y速度比使用角度更容易.


这仅适用于所有墙壁都与坐标轴对齐的情况,即使这样,您也需要单独的垂直和水平墙面.在一般情况下,它可能更容易正确.
这是处理这个问题的一种非常优雅的方式.

3> ChrisF..:

对于完美的粒子(和光),反射角等于入射角,如该图所示(来自commons.wikimedia.org).

反射角度

在Google中搜索"反射角度"(不带引号).

当你考虑到物体的弹性和材料以及障碍物时,它会有点复杂;)



4> 小智..:

我遇到了这个问题,我发现的唯一方法是分离碰撞轴!

试试吧:

x += velocity * Math.cos(angle * Math.PI /180);
y += velocity * Math.sin(angle * Math.PI /180);

if (x < 0 || x > canvas.width) {
     angle = 180 - angle;   
}
else if (y < 0 ||y > canvas.height) {
     angle = 360 - angle; 
}

我希望这可以帮助你!



5> itsmatt..:

除了您要问的特定物理问题外,我还会推荐Wendy Stahler撰写的"为游戏程序员开始数学和物理"一书.我发现它对我的游戏/物理编程项目非常有用.

本书附带的代码是C++,但如果您了解C#,那么进行转换将非常容易.

祝你有个好的一天!

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有