【问题标题】:How are sine and cosine used for collision detection?正弦和余弦如何用于碰撞检测?
【发布时间】:2019-11-18 08:29:27
【问题描述】:

我正在学习制作旧街机游戏 Breakout 的教程 - 你在屏幕底部有一个桨,目标是将移动的球转向屏幕顶部的一系列块。

计算反弹效果的代码是:

ball.dx = ball.speed * Math.sin(angle);
ball.dy = - ball.speed * Math.cos(angle);

黄色圆圈代表球:

我将正弦和余弦理解为斜边的比率;我似乎仍然无法理解它们是如何在这里准确计算回弹角的。谁能解释给定角度和速度值的结果数字如何在反弹时产生球的方向性?我觉得我缺少一个简单的概念部分。

【问题讨论】:

  • 它们没有被用来计算回弹角;角度是您所显示内容的输入。它们被用来计算给定角度的矩形的两侧,正如您所说的使用与斜边的三角关系。
  • 阅读基础物理书籍中的牛顿力学章节会对您有很大帮助。
  • 有几种定义函数cos和sin的方法。您在这里需要的是单位圆之一。例如:khanacademy.org/math/algebra2/…
  • 我花了一些时间思考后的理解是,作为输入的角度提供了计算 Y 值 (ball.dy) 和 X 值 (ball.dx) 的方法。这两个结果值(作为坐标)提供了以编程方式在画布上移动球的方法。因为 JavaScript 函数返回一个介于 -1 和 1 之间的值,所以产生的运动效果会很慢,所以我们乘以斜边 ball.speed 来增加球的移动速度。我在球场上吗?

标签: javascript math trigonometry


【解决方案1】:

这是向量相加 - 添加的 X 和 Y 向量为您提供新的速度值。 为了更容易理解 sin 和 cos 在这里的工作原理,以 angel = 0 度为例。球直接落下,应该会反弹回来:

ball.dx = ball.speed * Math.sin(0); // 0
ball.dy = - ball.speed * Math.cos(0); // 1

所以没有左右移动,速度是一样的,但垂直方向是相反的,因为减号。

在这里使用 sin 和 cos 可以确保速度保持不变,因为它们的总和始终为 1。

希望这比混淆更清晰,但我做了一些类似的代码任务,这些任务很容易通过基本的向量运算解决。

【讨论】:

  • these always sum up to 1 不完全是,它比这有点棘手。你得到的是一个恒定的斜边——这意味着速度不会改变,但这并不意味着与sin(x) + cos(x) = 1dx + dy = constant 相同。不变的是sqr(dx) + sqr(dy)
  • 动量守恒是这里的关键思想。
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 2023-03-28
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
相关资源
最近更新 更多