如果你在一个2D多边形中有一个“球”,比如由4条线段组成的边界墙,那么在与不规则倾斜的墙碰撞后,如何计算球的角度?
我知道如何让球反弹,如果墙是水平的,垂直的,或以45度角。我还设置了我的代码来检测与墙的碰撞。
我读过关于点积和normals的文章,但我想不出如何在Java / Android中实现它们。我完全被难住了,感觉就像我已经在Google中查找了10页深的东西10次。我已经筋疲力尽了,我希望有人能帮上忙。
发布于 2010-12-24 08:47:33
提前道歉:我不知道正确的Android类型。我假设你有一个具有'x‘和'y’属性的向量类型。
如果墙是水平的,并且电流速度是“矢量”,那么它就像这样简单:
vector.y = -vector.y;你就不会去管x分量了。所以你需要做一些类似的,但更通用的事情。
您可以通过将直线法线(垂直于直线的向量)的概念替换为y轴(垂直于水平方向)的硬编码来实现。
由于法线与直线正交,因此可以通过将直线旋转90度来找到它。在2d中,矢量(a,b)可以通过将其转换为(-b,a)来旋转90度。因此,如果你有一行从(x1,y1)到(x2,y2),那么你可以用:
vectorAlongLine.x = x2 - x1;
vectorAlongLine.y = y2 - y1;
normal.x = -vectorAlongLine.y;
normal.y = vectorAlongLine.x;您实际上并不关心原始行的长度(当您不想要它的时候,它会影响以后的计算),所以您想让normal的长度为1,而不管它当前的长度。您可以通过将其除以当前长度来实现此目的。因此,例如
lengthOfNormal = Math.sqrt(normal.x*normal.x + normal.y*normal.y);
normal.x /= lengthOfNormal;
normal.y /= lengthOfNormal;使用毕达哥拉斯定理来得到长度。
对于水平线,在y轴上翻转与(i)计算出矢量沿y轴延伸的范围相同;以及(ii)减去该量两次-一次得到该方向上的速度为0,再次使其成为原始速度的负值。也就是说,它与以下内容相同:
distanceAlongNormal = vector.y;
vector.y -= 2.0 * distanceAlongNormal;在一般情况下,点积用于计算向量沿法线延伸的距离。因此,它的作用与取vector.y对水平线的作用相同。这就是你可能需要做一点信念飞跃的地方。这是点积的一个性质,你可以通过检查一个直角三角形来说服自己。但是现在,如果你有一条水平线,你会得到法线(0,1)。因为点积应该是:
vector.x * normal.x + vector.y * normal.y你会计算出:
distanceAlongNormal = vector.x * 0.0 + vector.y * 1.0;这显然和只取y分量是一样的。
在计算出法线上的距离后,你实际上想要减去这个量乘以法线的2倍。这里唯一的额外步骤是乘以法线,得到要减去的2d数量。这是因为你要按正常的顺序减去。因此,基于前面正常计算的完整代码是:
distanceAlongNormal = vector.x * normal.x + vector.y * normal.y;
vector.x -= 2.0 * distanceAlongNormal * normal.x;
vector.y -= 2.0 * distanceAlongNormal * normal.y;如果没有将长度设为1,则需要除以此处的长度,因为点积将按该值缩放distanceAlongNormal值。
发布于 2010-12-24 10:48:20
https://stackoverflow.com/questions/4523434
复制相似问题