Jes*_*ond 0 c# xna vector rotation
我知道这可能是一个非常简单的问题,但我似乎无法弄明白.首先,我想指出我确实在半小时左右的时间内查看Google和SO而没有找到我的问题的答案(是的,我很认真).
基本上,我想围绕一个点旋转一个Vector2(在我的例子中,它总是(0,0)向量).因此,我尝试使用参数作为旋转点和旋转角度(以度为单位)来创建函数.
这是一个快速绘图,展示了我正在努力实现的目标:

我想取V1(红色矢量),将其旋转角度A(蓝色),以获得新的矢量(V2,绿色).在这个例子中,我使用了一个最简单的情况:轴上的V1和90度角,但我希望该函数能够处理更多" 复杂 "的情况.
所以这是我的功能:
public static Vector2 RotateVector2(Vector2 point, float degrees)
{
return Vector2.Transform(point,
Matrix.CreateRotationZ(MathHelper.ToRadians(degrees)));
}
Run Code Online (Sandbox Code Playgroud)
那么,我做错了什么?当我运行代码并使用(0,-1)向量和90度角调用此函数时,我得到向量(1,4.371139E-08)...
另外,如果我想接受一个点作为参数旋转呢?因此旋转并不总是发生在(0,0)附近......
Chris Schmich关于浮点精度和使用弧度的答案是正确的.我建议使用RotateVector2的替代实现,并回答问题的第二部分.
构建一个4x4旋转矩阵来旋转矢量将导致许多不必要的操作.矩阵变换实际上是在执行以下操作,但使用了大量冗余数学:
public static Vector2 RotateVector2(Vector2 point, float radians)
{
float cosRadians = (float)Math.Cos(radians);
float sinRadians = (float)Math.Sin(radians);
return new Vector2(
point.X * cosRadians - point.Y * sinRadians,
point.X * sinRadians + point.Y * cosRadians);
}
Run Code Online (Sandbox Code Playgroud)
如果要围绕任意点旋转,首先需要平移空间,以便旋转的点是原点,旋转然后反转平移.
public static Vector2 RotateVector2(Vector2 point, float radians, Vector2 pivot)
{
float cosRadians = (float)Math.Cos(radians);
float sinRadians = (float)Math.Sin(radians);
Vector2 translatedPoint = new Vector2();
translatedPoint.X = point.X - pivot.X;
translatedPoint.Y = point.Y - pivot.Y;
Vector2 rotatedPoint = new Vector2();
rotatedPoint.X = translatedPoint.X * cosRadians - translatedPoint.Y * sinRadians + pivot.X;
rotatedPoint.Y = translatedPoint.X * sinRadians + translatedPoint.Y * cosRadians + pivot.Y;
return rotatedPoint;
}
Run Code Online (Sandbox Code Playgroud)
请注意,矢量运算已内联以获得最大速度.
| 归档时间: |
|
| 查看次数: |
2570 次 |
| 最近记录: |