Управляемый пользователем Quaternion Slerp?

Я пытаюсь повернуть сферу с пользовательским контролем.

void RotateGlobe() {
    SetLock();

    if (Input.GetMouseButton(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        userInput.x = Input.GetAxis("Mouse X");
        userInput.y = Input.GetAxis("Mouse Y");

        if (userInput.magnitude > 0 & Physics.Raycast(ray, Mathf.Infinity, LayerMask.NameToLayer("UI")))
        {
            Vector2 movement = new Vector2(Mathf.Sign(userInput.x), Mathf.Sign(userInput.y));

            globe.transform.rotation = 
                Quaternion.Slerp(globe.transform.rotation, 
                Quaternion.Euler(0, movement.y * 90, movement.x * 180 + globe.transform.rotation.eulerAngles.x), 
                Time.time * speed);
        }
    }

    RemoveLock();
}

Я не совсем понимаю кватернионы (опять же, кто действительно понимает), но глобус не только неправильно реагирует на ввод пользователя, но и застревает на оси x. Я понимаю, что он, вероятно, выбирает кратчайший путь от 180 до -180, не двигаясь.

Я предполагаю, что на данный момент я полностью готов изменить этот код в пользу лучшего метода (не slerp), но я полностью застрял, и предыдущие методы были столь же сложными и изменчивыми.

Как бы вы посоветовали мне вращать эту сферу?

В качестве бонуса, если бы я мог ограничить ось, было бы здорово. Я не очень хочу крутить дальше 90 или -90.


person Community    schedule 19.04.2016    source источник
comment
никогда ни по какой причине не используй кватернионы, Андерс. Вы можете установить все углы с помощью localEulerAngles или eulerAngles, или, что еще лучше, просто используйте Rotate или, возможно, RotateAround   -  person Fattie    schedule 19.04.2016
comment
Я ценю чувство, стоящее за этим, потому что я тоже их ненавижу, но Slerp и Lerp настолько гладкие и оптимизированные... Плюс RotateAround устарел в 5.4.   -  person    schedule 19.04.2016
comment
RotateAround не устарел, вы просто используете старый: google answers.unity3d.com/ ответы/540399/view.html   -  person Fattie    schedule 19.04.2016
comment
Ну черт. Думаю, это то, чем я займусь завтра вместо этого... Спасибо за это. Это было определенно то, чего я не понимал... Зачем вам осуждать что-то такое полезное, лол? Если вы хотите написать, что RotateAround будет работать, ID с радостью выберет это в качестве ответа.   -  person    schedule 19.04.2016


Ответы (1)


простое решение - вы можете использовать Unity RotateAround, который является одним из их самых полезных вызовов

http://docs.unity3d.com/ScriptReference/Transform.RotateAround.html

Обратите внимание, что в Интернете есть несколько запутанных комментариев о том, что RotateAround устарела; на самом деле это только одна старая версия, которая устарела. Это один из самых распространенных вызовов, которые вы используете в Unity. Наслаждаться!

во-вторых.

Обратите внимание, что вы действительно вычисляете углы Эйлера! или возможные localEulerAngles. Вы можете просто проскользнуть между ними!!!!

что-то типа....

Vector3 fromEulers = blah;
Vector3 toEulers = blah;

transform.localEulerAngles = .. slerp .. fromEulers toEulers;

Окончательно. обратите внимание, что у "lerp-подобных" функций есть эквиваленты, такие как MoveTowards, которые вы можете использовать «своим шагом».

SmoothStep — фактически самый полезный вызов во всем единстве!

person Fattie    schedule 19.04.2016