unity3d Unity 2D-使用transform.RotateAround()更改旋转方向

ivqmmu1c  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(311)

我正在做一个简单的游戏,两个卫星围绕一个行星运行。我想让它按下一个按钮:

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(),但我很难理解它背后的精确数学。我也希望能简单解释一下它背后的数学,我不期望有现成的代码!谢谢!:)

3htmauhk

3htmauhk1#

您缺少else,即:

if (rotating_left)
{
    transform.RotateAround(planet.transform.position, new Vector3(0, 0, 1), rotation_speed);
}
else
{
    transform.RotateAround(planet.transform.position, new Vector3(0, 0, -1), rotation_speed);
}

rotating_left为true时,您当前的代码同时运行两个旋转,导致它们相互抵消。
至于数学,Unity中的旋转可能相当复杂,因为在内部它们被表示为四元数。作为一个开发人员,Transform.RotateAround只是将世界坐标系中的axis经过point的变换旋转angle度(从https://docs.unity3d.com/ScriptReference/Transform.RotateAround.html开始)。
Unity使用左手坐标系,这意味着如果你伸出左手,拇指沿着你旋转的轴的方向,然后握紧拳头,一个正Angular 将沿着你手指面对的方向旋转。

lvmkulzt

lvmkulzt2#

除了杰德维:
请考虑,少即是多:

...
private float direction = 1.0f
private void Update()
{

    if (Input.GetKeyDown(switch_rotation_moon_a))
        direction = -direction;

}

private void FixedUpdate()
{

    ...

    transform.RotateAround(planet.transform.position, new Vector3(0, 0, direction),  rotation_speed);

}

这将保存一个if语句和一个检查。方向将在键按下时反转,旋转也是如此。

相关问题