【发布时间】: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