找回密码
 立即注册
查看: 590|回复: 4

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

[复制链接]
发表于 2021-3-1 16:34 | 显示全部楼层 |阅读模式
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,具体忽略哪个轴看情况分析。
  1. public static Vector2 GetRotatePosition(Vector2 targetPosition, Vector2 centerPosition, float angele)
  2. {
  3.     float endX = (targetPosition.x - centerPosition.x) * Mathf.Cos(angele * Mathf.Deg2Rad) -
  4.                  (targetPosition.y - centerPosition.y) * Mathf.Sin(angele * Mathf.Deg2Rad) + centerPosition.x;
  5.     float endY = (targetPosition.y - centerPosition.y) * Mathf.Cos(angele * Mathf.Deg2Rad) +
  6.                  (targetPosition.x - targetPosition.x) * Mathf.Sin(angele * Mathf.Deg2Rad) + centerPosition.y;
  7.     return new Vector2(endX, endY);
  8. }
复制代码
需要注意的是,数学库Mathf里的三角函数库的参数都是弧度值,跟我们以往使用三角函数时使用的角度值是有区别的,所以需要把角度转换为弧度值,使用 角度* Mathf.Deg2Rad
最后需要注意的是,逆时针旋转角度使用正角度,顺时针使用负角度。
3.总结

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-3-1 16:43 | 显示全部楼层
你可以了解一下旋转矩阵或者四元数
发表于 2021-3-1 16:48 | 显示全部楼层
欧拉角旋转和四元数了解一下
发表于 2021-3-1 16:55 | 显示全部楼层
四元数和向量了解一下
发表于 2021-3-1 16:59 | 显示全部楼层
我觉得你这个是错的,你所列的圆参数方程仅限于圆心为原点的情况
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 15:33 , Processed in 0.067716 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表