围绕中心向量2点旋转对象

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

这是代码:

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(uY, uX); //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; } 

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

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

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


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

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

这是一个替代方案:

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

它确实“转化为世界起源,旋转,然后翻译”位。

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

编辑:修复变量名称

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

要围绕原点旋转矢量:

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

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

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

做轮换:

  1. 你获得了相对于原点的点(如代码中所示),
  2. 然后旋转
    • 使用trig获取角度,操纵它然后重新计算向量(如在代码中),
    • 或使用matricies(如我的代码中所示)。
  3. 最后将向量移回(如代码中所示)。

这个问题和我的答案,在理解trig时可能有一些用处: 给定一个角度,获得圆周上圆点的位置?