Заставьте slerp работать так же, как LookAt (x, Vector3.Right)

Я работал над шутером с боковой прокруткой. Я заставил своего персонажа-стрелка с боковой прокруткой осмотреться с помощью этих:

chest.LookAt(mousepos, Vector3.right);

&

chest.LookAt(mousepos, Vector3.left);

(Влево, когда персонаж поворачивается влево, и вправо, когда персонаж поворачивается вправо)

так что он не будет нацеливаться на любую другую ось ... Но когда мышь пересекает середину персонажа, а не вокруг него, она получает вращение, чтобы сделать небольшой переход между кадрами, и она не доберется до этой точки .. Он просто телепортируется в правильное положение, как и должен.

Вопрос в том, как мне заставить любой кватернионный slerp, который работает с Time.deltTime, работать так же, как LookAt (x, Vector3.Right)? У меня должен быть Vector3. right и left, чтобы он двигался через 1 ось.

Большое спасибо всем, кто мне помогает. :)


person Ben Rokah    schedule 11.10.2012    source источник


Ответы (1)


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

bool charWasFacingLeftLastFrame = false.
Vector3 targetVector = Vector3.zero;
Vector3 startVector = Vector3.zero;
float startTime = 0f;
float howLongItShouldTakeToRotate = 1f;

void Update () {
    Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Vector3 characterPos = character.transform.position;

    //check if mouse is left or right of character
    if(mouseWorldPos.x < characterPos.x) {
        //char should be facing left
        //only swap direction if the character was facing the other way last frame      
        if(charWasFacingLeftLastFrame == false) {
            charWasFacingLeftLastFrame = true;
            //we need to rotate the char
            targetVector = Vector3.left;
            startVector = character.transform.facing;
            startTime = Time.time;
        }
    } else {
        //char should be facing right
        //only swap direction if the character was facing the other way last frame      
        if(charWasFacingLeftLastFrame == true) {
            //we need to rotate the char;
            charWasFacingLeftLastFrame = false
            targetVector = Vector3.right;
            startVector = character.transform.facing;
            startTime = Time.time;
        }
    }

    //use Slerp to update the characters facing
    float t = (Time.time - startTime)/howLongItShouldTakeToRotate;
    character.transform.facing = Vector3.Slerp(startVector, targetVector, t);
}
person Tom Harris    schedule 06.11.2012