Как ограничить вращение функции Quaternion.Slerp () - PullRequest
0 голосов
/ 24 октября 2018

Я работал над проектом VR, в котором пара глаз отслеживает точку в мировом пространстве.Для начала я использую контроллер игрока в качестве цели.Глаза в настоящее время отслеживаются точно так, как я ожидаю, однако, поскольку они являются глазами, я бы хотел ограничить, насколько далеко они могут смотреть вверх / вниз и влево / вправо.Я попытался сделать это, используя localEulerAngles, который, кажется, работает, но как только я ввожу «неправильно», если блокировка, вращение глаза никогда не меняется снова, и поэтому остается застрявшим.Поэтому я думаю, что мне нужно вернуть вращение обратно в приемлемый предел, но я не знаю, как правильно это сделать.Я также думаю, что, возможно, есть лучший способ сделать все это, о чем я не знаю.Вот моя текущая функция обновления:

    void Update(){

    Vector3 direction = finger.position - this.transform.position;

    float angleX = transform.localEulerAngles.x;

    //this text is displayed in VR so that I can see while I test
    temp.text = transform.localEulerAngles.x.ToString();

    //this condition is for if the finger is held up in the air
    if (pointing)
    {
        //because of the way angles work, it is necessary to check what      CANT be?. 
        if (angleX > 15 && angleX < 350)
        {
            //what to do here?

        }
        else
        {
            //look at the finger
            this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 0.1f);
        }

    } 
}

1 Ответ

0 голосов
/ 24 октября 2018

Используйте метод Mathf.Clamp, чтобы ограничить значение с плавающей запятой между минимальным и максимальным значением, затем сбросьте угол X преобразования к фиксированному значению.

Таким образом, ваш метод Updateстановится:

void Update() {

    Vector3 direction = finger.position - this.transform.position;

    float angleX = transform.localEulerAngles.x;

    //this text is displayed in VR so that I can see while I test
    temp.text = transform.localEulerAngles.x.ToString();

    //this condition is for if the finger is held up in the air
    if (pointing)
    {
        float clampedAngle = Mathf.Clamp(angleX, 15f, 350f);
        transform.localEulerAngles.x = clampedAngle;

        //look at the finger
        this.transform.rotation = Quaternion.Slerp(this.transform.rotation, Quaternion.LookRotation(direction), 0.1f);
    }
} 
...