Объект колбасится при локальном вращении кватернионами.

Программирование на Юнити.

Объект колбасится при локальном вращении кватернионами.

Сообщение Инженер 13 июл 2021, 19:36

Локальное вращение в координатах самого объекта, а не его родителя. Хочу вращать объект локально по Х и глобально по Y, но проблема в том, что объект начинает колбаситься при превышении угла по любой оси более 60 град, если вращение делается локально. То есть когда он смотрит прямо и нужная ось 0, все ок, начинаешь вращать локально, все ок, пока не будет более 60 градусов, потом расколбас. Объект начинает бешено вращаться во всех направлениях, возвращаешь значение обратно менее 60, все успокаивается

Синтаксис:
Используется csharp
public Transform obj;

    float mouseSensetivity = 200f;
    float angleX;
    float angleY;

    void FixedUpdate()
    {
        float inputMouseX = Input.GetAxis("Mouse X") * mouseSensetivity * Time.deltaTime;
        float inputMouseY = Input.GetAxis("Mouse Y") * mouseSensetivity * Time.deltaTime;
        angleX += inputMouseX;
        angleY += inputMouseY;
        obj.localRotation = Quaternion.AngleAxis(angleX, obj.up) * Quaternion.AngleAxis(angleY, Vector3.right);
    }
 


С ограничителями то же самое:

Синтаксис:
Используется csharp
public Transform obj;

    float mouseSensetivity = 200f;
    float angleX;
    float angleY;

    void FixedUpdate()
    {
        float inputMouseX = Input.GetAxis("Mouse X") * mouseSensetivity * Time.deltaTime;
        float inputMouseY = Input.GetAxis("Mouse Y") * mouseSensetivity * Time.deltaTime;
        angleX = ClampAngle(angleX + inputMouseX, -90, 90);
        angleY = ClampAngle(angleY - inputMouseY, -90, 90);
        obj.localRotation = Quaternion.AngleAxis(angleX, obj.up) * Quaternion.AngleAxis(angleY, Vector3.right);
    }
    private float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360) angle += 360;
        if (angle > 360) angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
 


В главной строке:
obj.localRotation = Quaternion.AngleAxis(angleX, obj.up) * Quaternion.AngleAxis(angleY, Vector3.right);
как можно увидеть, по одной оси я вращаю в локальных координатах: angleX, obj.up , а в другой- в глобальных: angleY, Vector3.right. Впринципе, это ничего не меняет, если обе оси вращать в локальных obj.up и obj.right, будет колбасить в обоих направлениях.

Почему вращение не работает, как надо?
Инженер
UNIт
 
Сообщения: 88
Зарегистрирован: 22 май 2016, 11:13

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение 1max1 13 июл 2021, 19:52

Синтаксис:
Используется csharp
obj.Rotate(0, angleX, 0, Space.World);
obj.Rotate(angleY, 0, 0);

Домножать на дельта тайм нет смысла.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение Alkos26Rus 13 июл 2021, 22:02

1max1 писал(а):
Синтаксис:
Используется csharp
obj.Rotate(0, angleX, 0, Space.World);
obj.Rotate(angleY, 0, 0);

Домножать на дельта тайм нет смысла.

Почему? Разве Rotate сам учитывает дельта тайм?
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение 1max1 14 июл 2021, 08:30

Почему? Разве Rotate сам учитывает дельта тайм?

У него управление через мышку потому что.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение Инженер 15 июл 2021, 11:17

1max1 писал(а):
Синтаксис:
Используется csharp
obj.Rotate(0, angleX, 0, Space.World);
obj.Rotate(angleY, 0, 0);


Благодарю, действительно работает. Только нужно применять напрямую инпут, а не угол. В вопросе вращений я как слепой котенок.

1max1 писал(а):Домножать на дельта тайм нет смысла.


Хотел поспорить, т.к. привычно всегда все умножать на дельта тайм, но решил предварительно погуглить. И правда, с первого взгляда звучит не интуитивно, но умножать мышь на дельта тайм нельзя:
"Нет ... никогда не следует использовать Time.deltaTime, если ввод не зависит от частоты кадров. Если вы переместите мышь на 3 дюйма, время, необходимое вам для этого, совершенно не зависит от скорости работы вашего компьютера. Поэтому Time.deltaTime никогда не следует использовать при вводе с помощью мыши. Если вы это сделаете, ваша игра будет работать по-другому из-за колебаний частоты кадров, чего вы никогда не хотите."
https://forum.unity.com/threads/input-and-time-deltatime.293928/#post-1937814

Правда, есть некоторые исключения. Но не совсем понятно, о чем он говорит.:
"например, перемещение мыши на 3 дюйма или использование абсолютного движения джойстика для прицеливания. Тогда не используйте Time.deltaTime. Если вы используете относительное движение, при котором скорость движения в игре должна оставаться постоянной, независимо от скорости работы компьютера, используйте Time.deltaTime. Так что это будет зависеть от того, говорите ли вы о прямом или дистанционном прицеливании."
https://forum.unity.com/threads/input-and-time-deltatime.293928/#post-1937889

Что за "относительное движение, при котором скорость движения в игре должна оставаться постоянной, независимо от скорости работы компьютера", при которых надо использовать Time.deltaTime?
Инженер
UNIт
 
Сообщения: 88
Зарегистрирован: 22 май 2016, 11:13

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение Инженер 15 июл 2021, 11:34

Дочитал тему до конца:
"если ввод устанавливает скорость, то, как правило, все, что движется на основе этой скорости, должно учитывать время.

Если движение напрямую устанавливает позицию, то, как правило, вы хотите использовать эту позицию напрямую и не должны принимать во внимание время.
"
https://forum.unity.com/threads/input-and-time-deltatime.293928/#post-1937912

К какому пункту относится вращение объекта мышью или вращение камеры от первого лица? По-моему, к первому, т.е. все таки нужен Time.deltaTime.
Инженер
UNIт
 
Сообщения: 88
Зарегистрирован: 22 май 2016, 11:13

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение Alkos26Rus 15 июл 2021, 11:51

Да не, все таки не нужен дельта тайм. Вращение FPS камеры или вращение персонажа это тоже самое, все равно от мышки
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение 1max1 15 июл 2021, 13:12

Только нужно применять напрямую инпут, а не угол.

Блин, действительно, я тупанул)
Можно создать переменную float mouseY и приплюсовывать туда, а потом присваивать в эйлеры:
Синтаксис:
Используется csharp
mouseY += inputMouseY;
var eu = transform.localEulerAngles;
eu.x = mouseY;
transform.localEulerAngles = eu;

Так можно и клэмпить угол. А по X вращать через Rotate.
К какому пункту относится вращение объекта мышью или вращение камеры от первого лица? По-моему, к первому, т.е. все таки нужен Time.deltaTime.

Просто, если движение/поворот происходит каждый кадр, то надо умножать, если нет, то не надо.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Объект колбасится при локальном вращении кватернионами.

Сообщение Инженер 15 июл 2021, 14:37

Я заставил работать Quaternion.AngleAxis. Оказывается, имеет значение очередность умножения:

"Есть только одно действительно простое правило, которое вам нужно запомнить: порядок имеет значение.
Поворот вокруг локальной оси: rotation = rotation * Quaternion.AngleAxis (10, Vector3.Up);
Вращение вокруг мировой оси: rotation = Quaternion.AngleAxis (10, Vector3.Up) * rotation;
"
https://forum.unity.com/threads/understanding-rotations-in-local-and-world-space-quaternions.153330/#post-1051063

В моем случае это:
Синтаксис:
Используется csharp
            obj.rotation = obj.rotation * Quaternion.AngleAxis(inputMouseX, Vector3.up);
            obj.rotation = Quaternion.AngleAxis(-inputMouseY, Vector3.right) * obj.rotation;
 
Инженер
UNIт
 
Сообщения: 88
Зарегистрирован: 22 май 2016, 11:13


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10