Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

Разворот на более 360+ градусов

#unity3d #unity3d_ui


Если задать примерно такой разворот:

Quaternion quaternion = Quaternion.Euler(0, 0, 360 * A);


не важно что будет на месте A (из целых чисел) разворота никогда не будет, если же
счисло будет типа A.5 (число с запятой где после запятой половина) то разворот будет
ровно 180, из этого выходит что задать разворот на 3600 (т.е. 10 кругов) простым способом
нельзя, у меня выполняеться плавный поворот круга, что бы я не писал всякий бред по
типу считания каждого полукруга я задал вопрос: как сделать разворот на большое кол-во
градусов (т.е. более одного целого круга):
мой код поворота:

        Quaternion quaternion = Quaternion.Euler(0, 0, 1800);
    float t = 5f;
    float tA = Time.time;
    while (t > 0)
    {
        t -= Time.time - tA;
        tA = Time.time;
        Debug.Log(t);
        transform.GetComponent().rotation = Quaternion.Lerp(transform.rotation,
quaternion, (5-t)/5f);
        yield return 0;
    }


кстати, тут еще я хотел поворот ровно за 5 секунд, но почему-то (в силу моей незнанности
оно работает не верно).

Главный вопрос: как сделать разворот (в моем случае плавный) на несколько кругов,
по типу на 3600 градусов т.е. 10 кругов.

Второй же вопрос, как сделать разворот ровно за конкретное кол-во времени
    


Ответы

Ответ 1



Вся проблема заключается в том, что вращение вокруг любой оси физически ограничено и находится в промежутке [0;360), если речь идет о градусах. Но не надо путать: мы можем повернуть объект хоть на миллиард градусов - в конце концов он все равно будет иметь поворот в промежутке [0;360). Да и проверить это на практике довольно просто, сделаем так: Debug.Log(Quaternion.Euler(0, 0, 1800).eulerAngles); Debug.Log(Quaternion.Euler(0, 0, 1799).eulerAngles); Смотрим на вывод: Исходя из написанного выше, использовать "референсное" значение для поворота таким образом не получится. Подобное можно реализовать через фиксированный поворот: public class Rotator : MonoBehaviour { public Vector3 rotationStep = new Vector3(0, 0, 0); public float time = 0; IEnumerator RotateForSeconds(float seconds, Vector3 step) { while(seconds > 0) { seconds -= Time.deltaTime; transform.Rotate(step * Time.deltaTime); yield return null; } } void Start() { StartCoroutine(RotateForSeconds(time, rotationStep)); } } А дальше простейшие расчеты: Нужно повернуть объект на 360 градусов за 10 секунд? Значит, нам нужна скорость в 360/10 = 36 градусов в секунду: Нужно повернуть объект на 1800 градусов за 5 секунд? Повторяем действия выше: 1800/5 = 360: А вообще для всего, что связано с ручной анимацией, лучше использовать LeanTween или любой другой tween engine. Но проблема в том, что такие движки работают с "референсными" значениями, что нам не особо подходит из рассуждений выше, но как дополнительную информацию все же оставлю. Залезаем в документацию: LTDescr rotate(GameObject gameObject, Vector3 to, float time) Defined in LeanTween.cs:1481 Rotate a GameObject, to values are in passed in degrees

Комментариев нет:

Отправить комментарий