我应该以我不是数学家作为开场白。我在另一个问题中找到的代码似乎有点工作......除了它会导致我放置的对象在一个大圆圈中旋转,大部分都在屏幕外。
代码如下:
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 确定角度。之后的其余部分对我来说是个谜。我知道我应该学习一切的作用,而且我确实打算在 Spring 开始上大学时(只晚了十年)。我试过阅读它们,但我迷路了。任何帮助将不胜感激。
另外,如果您有一个好的 trig for dummies 网站可以推荐,我会很高兴通读它。
最佳答案
这里有一个替代方案:
public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation)
{
return Vector2.Transform(point - origin, Matrix.CreateRotationZ(rotation)) + origin;
}
它执行“转换到世界原点,旋转,然后转换回”位。
无论原点相对于世界原点的位置如何,这都会将“点”围绕“原点”旋转“旋转”弧度。触发发生在内置函数“CreateRotationZ()”中。要查看它如何应用触发器,请在框架中反射(reflect)该方法。
编辑:修复变量名
关于c# - 围绕中心 vector2 点旋转对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8148651/