内托体头 发表于 2021-3-1 16:34

Unity游戏开发——绕点旋转问题

0.前言

最近遇到一个需求,要计算出一个点绕另一个点旋转一定角度的路径。
虽然可以通过各种奇淫技巧达成这需求,但我还是想从数学的角度去处理这个问题。
这样一来,以后就可以通过调用我自己的数学库来完成相关问题的计算了。
1.分析问题

假设我们让(x,y)点绕(rx0,ry0)旋转a度,得到(x0,y0)。
我们最后要得到的点就是(x0,y0)。
规定旋转半径是r,最终点通过三角函数可以得到:
x0 = r * cos(a+b)
y0 = r * sin(a+b)
到这里其实半径和角度我们都可以通过计算求出来,但是我觉得还是麻烦,所以我们通过三角函数的和差角公式继续展开
二角和差公式
x0 = r * cosa coab - r * sina sinb
y0 = r * sina cosb+ r * cosa sinb
这其中出现了可以化简的部分
r * sinb = y- ry0
r * cosb = x -rx0
所以最终我们得到公式
x0 = (x - rx0) * cosa - (y - ry0) * sina
y0 = (x - rx0) * sina + (y - ry0) * cosa
这里公式的未知量变成了最初的三个原始变量,两个点和一个旋转角度。
所以我们只需要输入这个三个两就会得到最总的结果。
2.代码实现

这里绕点旋转问题是在2D平面中进行的,所以参数和返回值都是Vector2,具体忽略哪个轴看情况分析。
public static Vector2 GetRotatePosition(Vector2 targetPosition, Vector2 centerPosition, float angele)
{
    float endX = (targetPosition.x - centerPosition.x) * Mathf.Cos(angele * Mathf.Deg2Rad) -
               (targetPosition.y - centerPosition.y) * Mathf.Sin(angele * Mathf.Deg2Rad) + centerPosition.x;
    float endY = (targetPosition.y - centerPosition.y) * Mathf.Cos(angele * Mathf.Deg2Rad) +
               (targetPosition.x - targetPosition.x) * Mathf.Sin(angele * Mathf.Deg2Rad) + centerPosition.y;
    return new Vector2(endX, endY);
} 需要注意的是,数学库Mathf里的三角函数库的参数都是弧度值,跟我们以往使用三角函数时使用的角度值是有区别的,所以需要把角度转换为弧度值,使用 角度* Mathf.Deg2Rad 。
最后需要注意的是,逆时针旋转角度使用正角度,顺时针使用负角度。
3.总结

其实也没有什么的,就是用了三角函数的公式,最后把这个方法放到自己的工具库里使用就行了。

素色流年783 发表于 2021-3-1 16:43

你可以了解一下旋转矩阵或者四元数

宇宙无限 发表于 2021-3-1 16:48

欧拉角旋转和四元数了解一下

123456848 发表于 2021-3-1 16:55

四元数和向量了解一下

塞翁364 发表于 2021-3-1 16:59

我觉得你这个是错的,你所列的圆参数方程仅限于圆心为原点的情况
页: [1]
查看完整版本: Unity游戏开发——绕点旋转问题