我使用Canvas API在JavaScript中制作游戏。
我执行圆形以分割碰撞,我需要通过其速度向量计算圆的角度速度,我使用此公式来执行此操作:
ball.av = ball.v.length() / ball.r
// ball.av = angular velocity
// ball.v = velocity vector, contains x and y values
// .length() = returns initial velocity (pythagoras) for example: return Math.sqrt(ball.v.x * ball.v.x + ball.v.y * ball.v.y)
// ball.r = radius
现在因为平方根不能为负,所以当球应该逆时针旋转时,这不会起作用。所以,我需要一个初始速度的签名版本也可能是负面的,我该如何计算呢?
我已经听说过Wedge产品正在为此工作,我已经阅读了很多关于它的文章,但我仍然不了解如何在我的代码中实现它,请帮助!
答案 0 :(得分:2)
在一般情况下,如果球在表面上滚动,则角速度将是速度与半径上的表面法线的交叉乘积。
ball.av = CrossProduct(surfaceNormal, ball.v) / radius;
但是如果你总是沿着x方向在平坦的表面上,那么这简化了:
ball.av = -ball.v.x / ball.r;
如果你没有它,这是你的交叉产品。
float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
return (v1.X*v2.Y) - (v1.Y*v2.X);
}
注意:如果球向后滚动,只需添加一个' - '签署您的计算或交换crossProduct调用中的参数,但我认为他们是正确的,因为我已经写了它们。
曲面法线是来自曲面的垂直归一化(单位)矢量。在您的情况下,曲面法线是从接触点到圆心的标准化矢量。
作为一个侧面说明,当球滚动时,将重力分量移除到表面中,这样做:
vec gravity;
gravity = gravity - surfaceNormal*dot(surfaceNormal, gravity);
然后,当球在表面滚动时,您可以应用合成重力。