C# 对象围绕中心矢量2点的旋转

C# 对象围绕中心矢量2点的旋转,c#,math,xna,xna-4.0,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 rot

我应该先说一句,我不是一个喜欢数学的人。我在另一个问题中发现的代码似乎在某种程度上起作用。。。除了它会导致我放置的对象在屏幕外旋转一个大圆圈

代码如下:

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;
} 
通过鼠标单击中心向量周围的任意位置来设置位置

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

原点是我试图旋转的矢量2。静态设置为384384


据我所知,这是得到两个向量之间的距离,然后使用atan2来确定角度。接下来的事情对我来说是个谜。我意识到我应该学习每件事都做些什么,我确实打算在春天开始上大学(只晚了十年)的时候学习。我试着读了一下,但是我迷路了。任何帮助都将不胜感激


另外,如果你有一个很好的傻瓜网站,你可以推荐,我会很高兴阅读它。

这是很容易做到的使用矩阵,虽然基本理论可能有点难以理解,你不需要真正知道它的所有使用它(站在巨人的肩膀上等等)

要围绕原点旋转向量,请执行以下操作:

Vector2.Transform(PosComponent.Direction, Matrix.CreateRotationZ(-0.1f))
其中,
PosComponent.Direction
是我的向量,
-0.1f
是它要旋转的量(弧度,而不是度)

由于要围绕原点以外的对象旋转向量,因此需要先移动向量,然后旋转,然后再向后移动。这基本上就是你上面的代码所做的,除了得到角度和旋转,它使用三角

进行旋转:

  • 得到相对于原点的点(如代码中所示)
  • 然后旋转其中一个
    • 使用trig获得角度,操纵它,然后重新计算矢量(如代码中所示)
    • 或使用矩阵(如在我的代码中)
  • 最后将向量向后移动(如代码中所示)

  • 这个问题和我的回答可能对理解trig有一定的帮助:

    这里有一个替代方案:

    public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation)
    {
        return Vector2.Transform(point - origin, Matrix.CreateRotationZ(rotation)) + origin;
    } 
    
    它执行“平移到世界原点,旋转,然后平移回”位

    这将通过“旋转”弧度围绕“原点”旋转“点”,而不考虑原点相对于世界原点的位置。触发器发生在内置函数“CreateRotationZ()”中。要了解它如何应用trig,请在框架中反映该方法

    编辑:修复变量名