我正在开发一款简单的游戏,我正试图在游戏中简化部分2D碰撞反应。当某些物体碰到墙壁时,我正在计算碰撞法线(collisionPoint - objectCenter
)并根据该法线进行反射。我有兴趣将法向矢量四舍五入到最接近的15°,但我不确定这是一个很好的方法。
我目前的想法是做这样的事情
float angle = atan2(normal.Y, normal.X) * Rad2Deg;
float newAngle = ((int)(angle + 7.5f) / 15) * 15.0f * Deg2Rad;
vector2 newNormal = vector2(cos(newAngle), sin(newAngle));
这是一种合理的方法吗?还有更好的方法吗?
答案 0 :(得分:2)
试试这个:
float roundAngle = 15 * Deg2Rad;
float angle = (float)Math.Atan2(normal.Y, normal.X);
Vector2 newNormal;
if (angle % roundAngle != 0)
{
float newAngle = (float)Math.Round(angle / roundAngle) * roundAngle;
newNormal = new Vector2((float)Math.Cos(newAngle), (float)Math.Sin(newAngle));
}
else
{
newNormal = Vector2.Normalize(normal);
}
您不需要添加7.5,请参考此示例:
// 4 degrees should round to 0
(4 + 7.5) / 15 == 11.5 / 15 == 0.77
// When this gets rounded up to 1 and multiplied by 15 again, it becomes 15 degrees.
// Don't add 7.5, and you get this:
4 / 15 == 0.27
// When rounded, it becomes 0 and, as such the correct answer
// Now how about a negative number; -12
-12 / 15 == -0.8
// Again, when rounded we get the correct number
答案 1 :(得分:0)
如果你想要最近的15度角,这实际上更正确: 这样做:
newangle% = INT(((angle%+7.5)/15)*15)
INT默认情况下,DOWN默认情况下向下舍入,这应该可以正确地给你最近的角度,无论是正面还是负面都有乐趣! 并将你使用度数的部分加到rad和rad到度数如果需要INSIDE the parens(就像角度%旁边,如果没有用度数给出角度那么在那里使用某种rad2deg乘数) 这更像是你在基本的方式做到这一点,经过一些修改它会在c代码等工作,祝你好运!