计算旋转直线的反弹角度

Calculate bounce angle aggainst rotated line

本文关键字:旋转 计算      更新时间:2023-10-16

我一直在尝试实现这个问题的第二个答案

我的变量的名称主要与链接中的相同。

在这里,他们计算具有法线的旋转表面上的点的反弹角,但我似乎做不到,我做错了什么吗?

我期望的输出值是在旋转线上反弹后的新速度,目前我的输出正在做各种疯狂的事情,反弹到很高,反弹到另一个方向,有时是正确的方向,但大多忽略了我的线的旋转角度。

这是我当前的代码:

变量:

  • 顶部是我直线的第一点
  • 右边是我直线的第二点
  • n是常态
  • v是速度
  • dotv是n*v
  • dotn是n*n

旧代码:

sf::Vector2f n(-(top.y - right.y),(top.x - right.x));
sf::Vector2f dotv = sf::Vector2f(ball.getSpeed().x * n.x, ball.getSpeed().y * n.y);
sf::Vector2f dotn = sf::Vector2f(n.x*n.x,n.y*n.y);
sf::Vector2f u = sf::Vector2f(dotv.x/dotn.x,dotv.y/dotn.y);
u = sf::Vector2f(u.x*n.x,u.y*n.y);
sf::Vector2f w = ball.getSpeed() - u;
ball.setSpeed(sf::Vector2f((sf::Vector2f(w.x*0.5,w.y*0.5)-u)));

编辑:

新代码:

sf::Vector2f n(-(top.y - right.y),(top.x - right.x));
double dotv = ball.getSpeed().x*n.x + ball.getSpeed().y*n.y;
double dotn = n.x*n.x + n.y*n.y;
sf::Vector2f u = sf::Vector2f((dotv/dotn)*n.x, (dotv/dotn)*n.y);
sf::Vector2f w = ball.getSpeed() - u;
ball.setSpeed(sf::Vector2f(ball.getSpeed().x,ball.getSpeed().y) - w);

起初,我犯了将点积计算为向量的错误,这个问题已经解决了,现在它仍然给了我一个奇怪的输出。它以反向法线的角度将我的球直接穿过我的物体

如有任何帮助,我们将不胜感激。

我看到的一个问题是,将点积作为向量。点积产生标量(单个值)。

此外,为了让您的生活更轻松,您可以为向量运算创建函数,甚至在适当的时候重载运算符。例如矢量加法、减法。对于点积和叉积,正则函数可能是最好的。以下是的一些例子

class Vector2f
{
    // Member of Vector2f
    X& operator+=(const Vector2f& other)
    {
        x += other.x;
        y += other.y;
        return *this;
    }
};
// Not member of Vector2f
inline Vector2f operator+(Vector2f a, const Vector2f& b)
{
  a += b;
  return a;
}
double dot(const Vector2f& a, const Vector2f& b)
{
    return a.getX()*b.getX() + a.getY()*b.getY();
}