XNA 2D矢量角度-如何正确计算?

15

XNA中2D向量角度的标准工作方式是什么?

0度指向右,90度指向上,180度指向左,270度指向下吗?

“标准”的实现有哪些?

float VectortoAngle(Vector2 vec)

而且

Vector2 AngleToVector(float angle)

如何使VectortoAngle(AngleToVector(PI)) == PI?

2个回答

25

回答你的第一个问题,0度表示向上,90度表示向右,180度表示向下,270度表示向左。 这里提供了一个简单的2D XNA旋转教程,以提供更多信息。

至于将向量转换为角度和返回,我在这里找到了几个好的实现方案:

Vector2 AngleToVector(float angle)
{
    return new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));
}

float VectorToAngle(Vector2 vector)
{
    return (float)Math.Atan2(vector.Y, vector.X);
}

如果你是新手,而且对二维编程不太熟悉,那么你可能需要了解Torque X 2D。这个工具可以为你提供很多帮助。如果你已经为XNA付费开发,那么你可以免费获取引擎二进制文件,并使用一个实用类将角度转换为向量,反之亦然,以及其他一些有用的函数。

编辑:如Ranieri在评论中指出的那样,当上方向是0度时,该函数无意义。下面是一个可以使用的函数(其中上方向是(0,-1),右是(1,0),下是(0,1),左是(-1,0)):

Vector2 AngleToVector(float angle)
{
    return new Vector2((float)Math.Sin(angle), -(float)Math.Cos(angle));
}

float VectorToAngle(Vector2 vector)
{
    return (float)Math.Atan2(vector.X, -vector.Y);
}

我还想指出,我已经使用Torque一段时间了,它将0度用于向上,所以这就是我得到这个部分的地方。在这种情况下,“向上”意味着以与文件相同的方式将纹理绘制到屏幕上。因此,“向下”将会倒置绘制纹理。


2
有些不对劲。你说0度指向上方,但是你的函数返回(1,0),在我看来这是大多数坐标系中0度的正确表示。 - drxzcl

1

XNA中没有规定某个角度代表的方向,因此您可以根据自己的喜好进行定义。

我不确定上一次在游戏中使用角度是什么时候。在几乎所有情况下,直接使用向量更容易,尽管一开始可能不太直观。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接