Камера горизонтального поворота на 360 ° с ползунком - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать сценарий, который позволит мне поворачивать камеру с эффектом Slerp в диапазоне от 0 ° до 360 ° (ось Y) через горизонтальный ползунок.Камера вращается только вдоль оси (я нахожусь в середине комнаты, и мне нужно развернуться с помощью горизонтального ползунка)

Я сделал два сценария: первый для применения к эталонному кубу для получениявращение и секунда, которые будут применены к камере для получения эффекта Slerp, после вращения куба.

Сценарий вращения куба на 360 °:

    public float speed;
    public Vector3 offset;
    public GameObject ObjectToRotate;

    public void SliderChanged(float speed)
    {
        ObjectToRotate.transform.rotation = Quaternion.Euler (speed*offset);
}

Скрипт для вращения камерыс эффектом Slerp:

    public Transform target;
    public float Speed = 0.1F;


    // Update is called once per frame
    void Update () {
        transform.rotation = Quaternion.Slerp (transform.rotation, target.rotation, Speed);     
    }
}

Работает, но с некоторыми проблемами: если я бегу слишком быстро с ползунком слева (0 °) вправо (359 °), вращение Slerp не будет продолжаться правильноно, кажется, поворачивается только на 1 °, как если бы он вернулся.

Как я могу решить?Спасибо!

1 Ответ

0 голосов
/ 06 июня 2018

Slerp всегда выбирает кратчайший путь между ориентациями, поэтому, если вы начнете с 0 и захотите закончить с 359, вы не получите хорошего поворота всех этих значений, но вы получите то, чтовы уже видите.

Вот моя идея, как решить эту проблему:

  1. Не используйте Transform для передачи данных от ползунка пользовательского интерфейса к объекту.Используйте просто float со значением угла.Получите его из пользовательского интерфейса и передайте его объекту как целевое вращение.

  2. Объект, который вы хотите повернуть, сохраняет свое последнее значение вращения как float.Когда вы устанавливаете новую цель, она выполняет интерполяцию этого числа с плавающей точкой.Допустим, ваше вращение было 0, теперь вы установили цель на 359, поэтому мы вращаемся от 0 в положительном направлении.Если скорость на кадр составляет 10 deg, то в итоге вы получаете вращение 10 и сохраняете его как ваше последнее вращение.

  3. Если вращение изменилось, вы вычисляете new кватернион, используя значение угла (10).

Таким образом, вы выполняете интерполяцию в линейном пространстве, где диапазон 0-359 ведет себя так, как вы ожидали.Затем после интерполяции вы вводите кватернионы, чтобы использовать это значение в качестве данных вращения.

Кстати: с помощью этого трюка вы также можете использовать больший диапазон, например 0-720, чтобы иметь возможность совершать два или более оборота.Вы не можете сделать то же самое, используя Quaternions.

...