2011-11-16 38 views
7

我应该在这里说明这一点,我不在数学人员附近。我在另一个问题中发现的代码似乎有点工作...除了它导致我放置的对象大部分在屏幕外旋转。围绕中心vector2点的物体的旋转

下面的代码:

public void Update(GameTime gameTime) 
{ 
    Location = RotateAboutOrigin(Center, Origin, 0.01f); 
} 

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation) 
{ 
    var u = point - origin; //point relative to origin 

    if (u == Vector2.Zero) 
     return point; 

    var a = (float)Math.Atan2(u.Y, u.X); //angle relative to origin 
    a += rotation; //rotate 

    //u is now the new point relative to origin 
    u = u.Length() * new Vector2((float)Math.Cos(a), (float)Math.Sin(a)); 
    return u + origin; 
} 

位置由围绕中心载体的任意位置点击鼠标设置。

中心是我点击时放置的对象的中心(你猜对了)。这是通过简单地划分纹理的高度和宽度来确定的。

原产地是vector2我试图旋转。它静态设置为384,384。


尽我所知,它得到两个向量之间的距离,然后使用atan2来确定角度。其余的事对我来说是个谜。我知道我应该知道一切都做了什么,而且我准备在春季开始上大学时(仅延迟十年)。我试着读过它们,但我迷路了。任何帮助,将不胜感激。另外,如果你有一个很好的傻瓜网站,你可以推荐,我很乐意通读它。

+0

http://stackoverflow.com/questions/7846775/how-to-gradually-rotate-an-object-to-face-another-turning-the-shortest-distance – Olle89

回答

10

这里是一个另类:

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation) 
{ 
    return Vector2.Transform(point - origin, Matrix.CreateRotationZ(rotation)) + origin; 
} 

它的“翻译成世界原点,旋转,然后转回“位。

无论原点在哪里相对于世界原点,这都会以'旋转'弧度围绕'原点'旋转'点'。该触发发生在'CreateRotationZ()'内置函数中。要了解它如何应用trig,请在框架中反映该方法。

编辑:固定变量名

2

尽管基础理论可能有点难以理解,但使用它并不需要知道它的全部(站在巨人的肩膀上以及所有这些),但使用matricies可以轻松完成。

要旋转向量绕原点:

Vector2.Transform(PosComponent.Direction, Matrix.CreateRotationZ(-0.1f)) 

哪里PosComponent.Direction是我的矢量和-0.1f是想转动(以弧度,不度)的量。

由于您想要围绕原点以外的其他东西旋转矢量,因此您需要先移动矢量,然后旋转,然后将其移回。这基本上是你上面的代码正在做的,除了获得角度并使用trig来做旋转。

不要做旋转:

  1. 你得到相对于原点的点(在你的代码),
  2. 然后旋转要么
    • 利用三角函数得到的角度,对其进行操作然后重新计算矢量(如在你的代码中),或者使用matricies(如我的代码中),
  3. 最后将向量移回(如在您的代码中)。

这个问题,我的答案,也许有些用处的理解TRIG:Get position of point on circumference of circle, given an angle?