Unity Добавить одноосное вращение - PullRequest
0 голосов
/ 12 марта 2020

Добрый день, возникла проблема с добавлением одной оси к повороту. У меня есть внешний метод, который устанавливает вращение в 2d на плоскости, привязанной к персонажу игрока. Но он не может использовать ось Y, поэтому вращение оружия ограничено плоскостью xz. Открытый метод имеет запись quterion для этого вращения, и я изо всех сил пытаюсь добавить к нему вертикальную часть.

protected virtual void RotateWeapon(Quaternion newRotation)
    {
        if (GameManager.Instance.Paused)
        {
            return;
        }

        RaycastHit hit;
        Physics.Raycast(_reticlePosition, Vector3.down * 1000, out hit);
        Debug.DrawLine(_reticlePosition, hit.point, Color.red);
        //Hit.point.z is a vertical part i need to add to newRotation

        // if the rotation speed is == 0, we have instant rotation
        if (WeaponRotationSpeed == 0)
        {
            transform.rotation = newRotation;
        }
        // otherwise we lerp the rotation
        else
        {
            transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, WeaponRotationSpeed * Time.deltaTime);
        }

1 Ответ

0 голосов
/ 12 марта 2020

Вы можете добавить вращения, умножив два Quaternions на оператор * подобно

newRotation *= additionalRotation;

Затем, чтобы сгенерировать additionalRotation, вы можете использовать Quaternion.Euler и передайте Vector3, представляющее вращение, разделенное на составляющие его угла Эйлера для каждой оси.

Я не совсем понял ваш вариант использования, но если вы хотите вращаться, например, только вокруг ось Z вы бы сделали

newRotation *= Quaternion.Euler(Vector3.forward * angle);

Или, если бы вы предпочли взять заданное Quaternion, но ограничьте его вращением только на определенной оси, такой как Z, вы можете использовать

newRotation =  Quaternion.Euler(Vector3.Scale(Vector3.forward, newRotation.euerAngles));

, где вы можете заменить Vector3.forward на любой другой вектор, указывающий, какие углы оси следует использовать, например, new Vector3(1,0,1) для сохранения вращения X и Z, но исключить вращение Y (см. Vector3.Scale)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...