从矢量方向得到适当的旋转

本文关键字:旋转 方向 | 更新日期: 2023-09-27 18:15:24

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

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版本。

我能做些什么来解决这个问题?

从矢量方向得到适当的旋转

首先,在您的示例中,不需要将其转换为度数,因为Math。aTan2以弧度为单位返回角度,只需将旋转变量除以(2*Pi)。

其次,检查你在"t.w ewidth/2, t.h eheight/2"做什么,因为你没有在你的问题中指定't'是什么,确保它的成员不是整数。

现在就你的问题本身而言,没有提供足够的信息。这在哪里包含你的轮换信息?"像素点"向量是你的世界空间位置,还是你也用它作为旋转?

回到最小值,以下代码的工作原理大致类似于您描述的?

Vector2 pixelpos = new Vector2(0, 1);
float rotation = (float)(Math.Atan2(pixelpos.Y, pixelpos.X) / (2 * Math.PI));

结果为0.25或90度

最好的计算方法是使用点积:

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%(我运行了测试)。

我想你忘记在360中使用float了,应该是360f