unity3d 如何旋转单位四元数并保持原轴?

rxztt3cl  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(178)

我正在为iOS开发一款简单的Unity益智游戏,游戏向用户展示了一个“rubiks cube”对象(一个由小立方体组成的大立方体)。
我希望用户能够在立方体上向左/右/上/下滑动,以按预期旋转。
我的代码可以工作,但是在用户执行第二次旋转后,立方体没有按照用户预期的方向旋转。在第一次旋转后,x/y/z轴已经沿着设备旋转。
如果我只使用左/右滑动代码,它会像预期的那样工作。当我添加上/下滑动代码时,它会中断。这是有道理的,因为当我坚持使用两个变量时,轴不会旋转。
下面是我的代码:

if (Input.GetMouseButtonUp(0))
    {

        //swipe upwards
        if (currentSwipe.y > 0 && currentSwipe.x > -1f && currentSwipe.x < 1f)
        {
            GameObject.FindGameObjectWithTag("Sfx").GetComponent<SoundManager>().PlaySwipe();

            gameObject.transform.DORotateQuaternion(Quaternion.Euler(0f, 0f, 90f), 0.5f).SetRelative(true).OnComplete(SetSwiping);
        }
        //swipe down
        if (currentSwipe.y < 0 && currentSwipe.x > -1f && currentSwipe.x < 1f)
        {
            GameObject.FindGameObjectWithTag("Sfx").GetComponent<SoundManager>().PlaySwipe();

            gameObject.transform.DORotateQuaternion(Quaternion.Euler(0f, 0f, -90f), 0.5f).SetRelative(true).OnComplete(SetSwiping);
        }
        //swipe left
        if (currentSwipe.x < 0 && currentSwipe.y > -1f && currentSwipe.y < 1f)
        {
            GameObject.FindGameObjectWithTag("Sfx").GetComponent<SoundManager>().PlaySwipe();

            gameObject.transform.DORotateQuaternion(Quaternion.Euler(0f, -90f, 0f), 0.5f).SetRelative(true).OnComplete(SetSwiping);
        }
        //swipe right
        if (currentSwipe.x > 0 && currentSwipe.y > -1f && currentSwipe.y < 1f)
        {
            GameObject.FindGameObjectWithTag("Sfx").GetComponent<SoundManager>().PlaySwipe();

            gameObject.transform.DORotateQuaternion(Quaternion.Euler(0f, 90f, 0f), 0.5f).SetRelative(true).OnComplete(SetSwiping);

        }
    }

任何帮助都是感激的!我是相对新的统一,所以还在学习。

0dxa2lsx

0dxa2lsx1#

我认为这样重新考虑设置更容易(至少对我来说):

private Quaternion _targetRotation; // this will jump to the rotation in discrete steps (i.e. not gradually)

Start(){
    _targetRotation = cube.transform.localRotation;
    ....
}
...
    var appliedRotation = Quaterion.identity;

    //swipe upwards
    if (currentSwipe.y > 0 && currentSwipe.x > -1f && currentSwipe.x < 1f){
        appliedRotation = Quaternion.AngleAxis(90f, Vector3.right);
    }
    ... // other swipe cases

    _targetRotation = appliedRotation * _targetRotation; // order is important afaik
    
    ...
    gameObject.transform.DOLocalRotateQuaternion(_targetRotation);

让我知道这是否可行。

相关问题