Страница 1 из 1

Корректировка вращения

СообщениеДобавлено: 19 апр 2017, 10:42
EagleOwle
Приветствую.
Есть приблизительно вот такая конструкция турели.
https://drive.google.com/file/d/0B0ZlcJ ... sp=sharing
Турель состоит из 3-ех обьектов.
Первый обьект вращается только по оси Y, второй только по оси X. Третий, это пушка. Она не вращается вообще.
Обьекты дочерние друг за дружкой.
Задача, повернуть турель так, что бы пушка смотрела на крестик.

Класс, который обрабатывает вращение
Синтаксис:
Используется csharp

void LateUpdate()
    {
        if (ModulStatus == ModulStatus.On)
        {
            transformRotationX.localEulerAngles = RotationAxisX(transformRotationX);
            transformRotationY.localEulerAngles = RotationAxisY(transformRotationY);
        }

private Vector3 RotationAxisY(Transform rotateTransform)
    {
        rotateTransform.rotation = Quaternion.RotateTowards(rotateTransform.rotation, GetDirection(rotateTransform), SpeedRotation());

         tempAngle = 0;

        tempAngle = rotateTransform.localEulerAngles.y;

        if (rotateTransform.localEulerAngles.y > 180f)
        {
            //если значение Y больше 180, то используем ограничение между 360 и максимальным ограничением
            tempAngle = Mathf.Clamp(tempAngle, 360f - modulConfig.rangeAngleGun, 360f);
        }
        else
        {
            if (transformRotationY.localEulerAngles.y < 180f)
            {
                //если значение Y меньше 180, то ограничение используем между 0 и минимальным ограничением
                tempAngle = Mathf.Clamp(tempAngle, 0f, modulConfig.rangeAngleGun);
            }
        }

        return new Vector3(0, tempAngle, 0);
    }

    private Vector3 RotationAxisX(Transform rotateTransform)
    {
        rotateTransform.rotation = Quaternion.RotateTowards(rotateTransform.rotation, GetDirection(rotateTransform), SpeedRotation());

         tempAngle = 0;

        tempAngle = rotateTransform.localEulerAngles.x;

        if (rotateTransform.localEulerAngles.x > 180f)
        {
             tempAngle = Mathf.Clamp(tempAngle, 360f - modulConfig.rangeAngleGun, 360f);
        }
        else
        {
            if (rotateTransform.localEulerAngles.x < 180f)
            {
                tempAngle = Mathf.Clamp(tempAngle, 0f, modulConfig.rangeAngleGun);
            }
        }

        return new Vector3(tempAngle, 0, 0);
    }

    }

private Quaternion GetDirection(Transform tempTransform)
    {
        //вектор, куда нужно вращать башню
        return Quaternion.LookRotation(gunTarget - tempTransform.position);
    }

 

Все работает корректно, каждый обьект наводится на цель.
А вопрос, собственно, вот в чем...
Из-за того, что пушка расположена в стороне от осей вращения, она смотрит не на крестик, а чуть в сторону.
Как узнать, на сколько скорректировать вращение самой пушки, что бы она смотрела на крестик?

Или может есть более простые способы наведения на цель...

Re: Корректировка вращения

СообщениеДобавлено: 19 апр 2017, 18:52
siriusspark
Как то громоздко у вас все реализовано...

Собственно вопрос - а почему нельзя ввести коррекцию пушки, чтобы она тоже находилась по нужному вектору?

Re: Корректировка вращения

СообщениеДобавлено: 19 апр 2017, 19:07
EagleOwle
Такое расположение обусловлено конструкцией(мешем).
Я просто не шарю в геометрии.
Логика подсказываете, что нужно вычислить, насколько повернуть пушку, зная расстояние между ней и соседним шарниром.

Re: Корректировка вращения

СообщениеДобавлено: 19 апр 2017, 19:17
siriusspark
Нет, я имел ввиду что саму пушку можно тоже слегка подкручивать.