2011-11-20 98 views
2

我目前有这样的代码在我的游戏:从矢量方向获得一个正确的旋转

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

首先,在你的情况下,没有必要将它转换成度,因为Math.aTan2以弧度返回角度,只需将旋转变量除以(2 * Pi)即可。第二,请检查你在“t.Width/2,t.Height/2”处做了什么,因为你没有在你的问题中指定什么是“t”,确保它的成员不是整数。

现在就问题本身而言,没有足够的信息提供。这包含你的轮换信息? 'pixelpos'矢量是你的世界空间位置,还是你也将它用作旋转?

回到最低限度,以下代码的工作原理与您所描述的大致相似?

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

其结果是0.25或90度。

+0

是的,它的工作,谢谢!我所需要做的就是得到结果并添加0.5f。 t变量是一个Texture2D,这个代码的目的是为了生成一个圆形成一个纹理,我已经工作了。我现在想要实现的是在圆周上具有不同高度的能力,所以我需要每个像素的旋转以告知哪些高度应该来自浮点值数组。谢谢,请祝我好运,其余的实施。 – Bananable

-1

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

+0

不,尽管我同意他应该使它成为正确的代码样式的float,函数MathHelper.ToDegrees()返回一个float值,编译器将隐式地将360转换为const float值。 – Marking

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%(我跑的测试)。