围绕中心向量点旋转对象

时间:2011-11-16 08:26:30

标签: c# math xna xna-4.0

我应该在这个前言,我不是一个数学家附近。我在另一个问题中找到的代码似乎有点工作......除了它导致我放置的对象大部分在屏幕外旋转。

以下是代码:

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;
} 

通过鼠标单击中心向量周围的任意位置来设置位置。

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

Origin是我试图旋转的vector2。它静态设置为384,384。


我可以说,它是两个矢量之间的距离,然后使用atan2来确定角度。其余的后来对我来说是一个谜。我知道我应该知道一切都做了什么,而且我打算在春季开始上大学(仅晚了十年)。我试过读它们,但我迷路了。任何帮助将不胜感激。

此外,如果你有一个很好的触发傻瓜网站,你可以推荐,我很乐意通读它。

2 个答案:

答案 0 :(得分:10)

这是另一种选择:

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

它“转换为世界原点,旋转,然后翻译”位。

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

编辑:修复变量名称

答案 1 :(得分:2)

使用matricies更容易完成,虽然基础理论可能有点难以理解,但你真的不需要知道所有这一点(站在巨人的肩膀上等等)。

围绕原点旋转矢量:

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

PosComponent.Direction是我的向量,-0.1f是要旋转的数量(以弧度表示,而不是度数)。

由于您想要围绕原点以外的其他内容旋转矢量,您需要首先移动矢量,然后旋转,然后将其移回。这基本上就是你上面的代码所做的,除了获得角度并使用trig进行旋转。

做一个轮换:

  1. 您获得相对于原点的点(如代码中所示),
  2. 然后旋转
    • 使用trig获取角度,操纵它然后重新计算向量(如代码中所示),
    • 或使用matricies(如我的代码所示)。
  3. 最后将向量移回(如代码中所示)。
  4. 这个问题和我的回答可能在理解trig:Get position of point on circumference of circle, given an angle?

    时有用