我目前在游戏中有这个代码:
Vector2 pixelpos = new Vector2(x, y);
Vector2 center = new Vector2(t.Width / 2, t.Height / 2);
Vector2 pixelposWorld = (pixelpos - center);
float rotation = (float)Math.Atan2(pixelposWorld.Y, pixelposWorld.X);
float rotationPercent = (MathHelper.ToDegrees(rotation) / 360);
我的目标是最终将rotationPercent设置为0.0到1.0之间的值,0度为0.0,180为0.5,360为1.0。
目前,rotationPercent仅为1.0。
我该怎么做才能解决这个问题?
答案 0 :(得分:4)
首先,在你的情况下,没有必要将它转换为度数,因为Math.aTan2以弧度为单位返回角度,只需将旋转变量除以(2 * Pi)。
其次,检查你正在做什么" t.Width / 2,t。高度/ 2",因为你没有在你的问题中指明什么' t'是的,确保它的成员不是整数。
现在就问题本身而言,提供的信息不足。这包含您的轮换信息?是' pixelpos'矢量你的世界空间位置,还是你也用它作为旋转?
恢复到最低限度,以下代码大致与您描述的一样?
Vector2 pixelpos = new Vector2(0, 1);
float rotation = (float)(Math.Atan2(pixelpos.Y, pixelpos.X) / (2 * Math.PI));
结果为0.25或90度。
答案 1 :(得分:1)
计算这个的最好方法是通过使用点积:
Vector2 pixelposWorld = Vector2.Normalize(pixelpos - center);
float dot = Vector2.Dot(Vector2.UnitX, pixelposWorld);
float rotation = (pixelposWorld.Y >= 0)
? (1f - dot) / 4f
: (dot + 3f) / 4f;
简单地说,它平均快120%(我运行测试)。
答案 2 :(得分:-1)
我想你忘了在360中使用float,它应该是360f。