Unity2D中使用transform.RotateAround()切换月球旋转方向问题
双月球绕行星游戏的旋转问题与RotateAround原理说明
我正在制作一款双月球绕行星运行的简易游戏,希望通过按键切换月球A的旋转方向,相关代码如下:
public KeyCode switch_rotation_moon_a; private bool rotating_left = false; private void Update() { if (Input.GetKeyDown(switch_rotation_moon_a)) { rotating_left = !rotating_left; } }
其中rotating_left变量用于决定旋转方向,旋转实现代码如下:
private void FixedUpdate() { planet_position = radius * Vector3.Normalize(this.transform.position - planet.transform.position) + planet.transform.position; this.transform.position = planet_position; if (rotating_left) { transform.RotateAround(planet.transform.position, new Vector3(0, 0, 1), rotation_speed); } transform.RotateAround(planet.transform.position, new Vector3(0, 0, -1), rotation_speed); }
游戏启动时月球初始方向旋转正常,但反转Z轴后旋转停止。我查阅了transform.RotateAround()的相关资料,但难以理解其具体数学原理,希望得到该方法的简易数学原理说明,无需现成代码。
RotateAround简易数学原理说明
- 核心逻辑:
RotateAround本质基于轴角旋转实现,它会让目标物体围绕指定中心点,沿给定旋转轴,按设定角度值做圆周运动。 - 右手定则判断方向:旋转方向遵循右手定则——将右手拇指指向旋转轴正方向,其余四指弯曲的方向就是物体旋转的方向。比如
Vector3(0,0,1)是Z轴正方向,此时四指弯曲方向为顺时针(从场景正上方俯视);Vector3(0,0,-1)是Z轴负方向,四指弯曲方向则为逆时针。 - 单次旋转的数学过程:
- 计算物体当前位置到中心点的向量(即半径向量);
- 以旋转轴为基准,对该半径向量做旋转变换(通过旋转矩阵或四元数计算,本质是让向量绕轴转动指定角度);
- 用变换后的向量加上中心点坐标,得到物体新位置,完成一次旋转。
内容的提问来源于stack exchange,提问作者MontyVan
相关产品推荐
相关产品推荐

