我正在做一个简单的游戏,两个卫星围绕一个行星运行。我想让它按下一个按钮:
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(),但我很难理解它背后的精确数学。我也希望能简单解释一下它背后的数学,我不期望有现成的代码!谢谢!:)
2条答案
按热度按时间3htmauhk1#
您缺少
else
,即:当
rotating_left
为true时,您当前的代码同时运行两个旋转,导致它们相互抵消。至于数学,Unity中的旋转可能相当复杂,因为在内部它们被表示为四元数。作为一个开发人员,Transform.RotateAround只是将世界坐标系中的
axis
经过point
的变换旋转angle
度(从https://docs.unity3d.com/ScriptReference/Transform.RotateAround.html开始)。Unity使用左手坐标系,这意味着如果你伸出左手,拇指沿着你旋转的轴的方向,然后握紧拳头,一个正Angular 将沿着你手指面对的方向旋转。
lvmkulzt2#
除了杰德维:
请考虑,少即是多:
这将保存一个if语句和一个检查。方向将在键按下时反转,旋转也是如此。