我应该在这个前言,我不是一个数学家附近。我在另一个问题中找到的代码似乎有点工作......除了它导致我放置的对象大部分在屏幕外旋转。
以下是代码:
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来确定角度。其余的后来对我来说是一个谜。我知道我应该知道一切都做了什么,而且我打算在春季开始上大学(仅晚了十年)。我试过读它们,但我迷路了。任何帮助将不胜感激。
此外,如果你有一个很好的触发傻瓜网站,你可以推荐,我很乐意通读它。
答案 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进行旋转。
做一个轮换:
这个问题和我的回答可能在理解trig:Get position of point on circumference of circle, given an angle?
时有用