从矢量方向获得正确的旋转

时间:2011-11-20 07:09:00

标签: c# vector xna

我目前在游戏中有这个代码:

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。

我该怎么做才能解决这个问题?

3 个答案:

答案 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。