【问题标题】:How do I find rotation transformed 2D coordinates in XNA?如何在 XNA 中找到旋转变换的 2D 坐标?
【发布时间】:2010-11-16 01:58:55
【问题描述】:

我正在制作一个 XNA 游戏,但在计算一些向量数学时遇到了一个小问题。

我有一个类,它表示具有 X 和 Y 整数坐标和 Rotation 浮点数的 2D 对象。我需要的是为 Position 提供 Vector2 属性,该属性获取并将 X 和 Y 设置为 Vector2,该 Vector2 已使用 Rotation 浮点数进行了转换。这样我就可以做类似的事情;

Position += new Vector2((thumbstick.X * scrollSpeed), -(thumbstick.Y * scrollSpeed));

并且对象将在它自己的向上方向移动,而不是视图的向上方向。

到目前为止,这就是我所拥有的...我认为该设置是正确的,但是对于 += 更改,它也需要一个 get 并且答案现在还没有出现... >.>

public Vector2 Position
{
    get
    {
        // What goes here? :S
    }
    set
    {
        X = value.X * (int)Math.Cos(this.Rotation);
        Y = value.Y * (int)Math.Cos(this.Rotation);
    }
}

【问题讨论】:

    标签: c# graphics xna 2d


    【解决方案1】:

    不,两者都不正确。

    这样的二维向量变换:

    x' =  x*cos(angle) - y*sin(angle)
    y' =  x*sin(angle) + y*cos(angle)
    

    角度以弧度为单位测量,零角度沿 x 轴正方向,当您绕 z 轴在平面外旋转时,零角度沿逆时针方向增加。旋转中心位于被变换向量的末端,因此想象原点为 (0,0) 的向量,结束于 (x,y) 旋转一个角度,直到它变成原点位于 (0,0) 的向量) 并在 (x', y') 结束。

    【讨论】:

    • 用什么单位测量角度并不重要,只要它在两个方程中是相同的单位:-)
    • 我所知道的三角函数的每个实现都使用弧度,所以从这个意义上说它确实很重要。如果您使用计算机来解决此问题,请考虑弧度。
    【解决方案2】:

    您还可以使用 Matrix 辅助方法创建一个 Z 旋转矩阵,然后将您的向量乘以它来旋转它。像这样的:

    Vector v1;
    Matrix rot = Matrix.CreateRotationZ(angle);
    Vector v2 = v1 * rot;
    

    【讨论】:

      【解决方案3】:

      我认为这是个坏主意。将所有对象的 X 和 Y 坐标保持在同一平面上,而不是每个都有自己的轴。一定要拥有PositionHeading 属性,并考虑使用Move 方法,该方法采用您的输入向量并进行数学运算以更新位置和航向。

      【讨论】:

      • 这就是为什么我想把它变成一个属性。您可以直接引用 X 和 Y 坐标,也可以使用该属性来获取或设置它们,就好像它们在旋转平面中一样。它可以更轻松地计算对象的移动控制,该对象根据其旋转指向的位置改变方向。
      • 不确定我是否同意 - 我认为这会令人困惑。
      • 我不明白为什么会令人困惑;这完全是可选的。它只是移动对象的一个​​小帮手,“向前”应该始终对应于精灵的某个边缘,而不是视口的顶部。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多