计算旋转直线的反弹角度
Calculate bounce angle aggainst rotated line
我一直在尝试实现这个问题的第二个答案
我的变量的名称主要与链接中的相同。
在这里,他们计算具有法线的旋转表面上的点的反弹角,但我似乎做不到,我做错了什么吗?
我期望的输出值是在旋转线上反弹后的新速度,目前我的输出正在做各种疯狂的事情,反弹到很高,反弹到另一个方向,有时是正确的方向,但大多忽略了我的线的旋转角度。
这是我当前的代码:
变量:
- 顶部是我直线的第一点
- 右边是我直线的第二点
- 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();
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 如何使用增强::几何计算多边形的旋转固体体积?
- 给定方向和位置如何使用 GLM 计算旋转矩阵
- 快速计算变换/旋转马里克斯4x4
- 在Qt5的OpenGL绘图中通过鼠标移动计算对象旋转角度
- 如何从OpenCV rvecs计算旋转角度
- OpenCV 计算相机位置和旋转
- c++:旋转锁或互斥对象比较(简单计算)
- 对象旋转/平移后重新计算AABB正确
- 从盒子计算 AABB(中心、半大小、旋转)
- 如何使用OpenCV计算两帧之间的旋转平移矩阵
- 如何在三维空间中计算旋转碰撞
- obb旋转计算
- c++OpenGL的旋转和计算
- 我们如何计算旋转和平移两个立体相机在opencv StereoRectify(r,t自变量)中使用
- 如何计算基于方向向量的旋转矩阵
- 计算旋转直线的反弹角度
- 如何在平移/旋转后重新计算轴对齐的边界框