【问题标题】:Calculate bounce angle aggainst rotated line计算针对旋转线的反弹角度
【发布时间】:2014-04-10 07:41:48
【问题描述】:

我一直在尝试实现The second answer of this question

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

在这里,他们用法线计算旋转表面上一个点的反弹角, 但是我好像做不到,是不是我做错了什么?

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

这是我当前的代码:

变量:

  • 顶部是我线的第一个点
  • 右是我线的第二点
  • 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);

起初我犯了将点积计算为向量的错误,这已解决,现在它仍然给我一个奇怪的输出它以反向法线的角度直接通过我的对象发射我的球

任何帮助将不胜感激。

【问题讨论】:

  • 您是否收到错误消息?还是不正确的价值观?这些价值观是什么?您的期望是什么?
  • 在问题中对其进行了编辑。
  • 点积不是向量。它是一个标量。没有检查其余代码,但这可能是主要问题。
  • 好的,感谢您澄清这一点,但是在我发送的链接的第二个答案中,他们为点积 V 和 N 作为向量做了 V * N,我如何将其变成标量? (N * N 也是一样)

标签: c++ visual-c++ math normals


【解决方案1】:

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

此外,为了让您的生活更轻松,您可以为向量操作创建函数,甚至在适当的时候重载操作符。例如。矢量加法,减法。点积和叉积的常规函数​​可能是最好的。以下是我的意思的一些示例

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();
}

【讨论】:

  • 首先感谢您的意见。但是标量是根据 2 个向量计算得出的,在我发送给您的链接中,他们根据法线和速度计算它,我怎样才能从 2 个 2value 值中得出一个值?
  • 我用一些代码更新了我的答案。对于这种编程,了解线性代数和一点物理学真的很有帮助。这是一个阅读更多关于点积的链接en.wikipedia.org/wiki/Dot_product
  • 关于链接中第二个答案的问题,它指出:u = (v · n / n · n) n,vn 和 nn 是制成的点积向量,但我该怎么做 (dotv/dotn)*n,n 会是什么?我假设你不能做双 * 向量。(我应该做 n.x + n.y 得到 n 吗?)
  • 是的,您可以将向量与标量相乘。您只需将每个向量分量与标量相乘。 dummies.com/how-to/content/…
  • 在我编辑新代码之前,你帮了很多忙(我得到它工作后也会使用你的方法)。但是你能再看看我的新代码吗?目前使用这个新代码,我的球以法线的角度飞过我的物体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多