Сглаживание вращения с помощью Quaternion.Lerp - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь выровнять своего персонажа с землей, стреляя raycast вниз и выравнивая вращение моих персонажей с нормальным основанием.

Вот фрагмент:

RaycastHit hit;
Vector3 ray = transform.TransformDirection(Vector3.down);

if(Physics.Raycast(transform.position, ray, out hit)) {
    transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.rotation;
}

Когда яя пытаюсь сгладить это вращение, хотя, похоже, оно вообще не происходит.

Вот как я пытаюсь отменить эти значения.

RaycastHit hit;
Vector3 ray = transform.TransformDirection(Vector3.down);

if(Physics.Raycast(transform.position, ray, out hit)) {
    quatTargetRotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.rotation;
    transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.FromToRotation(Vector3.up, hit.normal), 0.5f * Time.deltaTime);
}

quatTargetRotation являетсяпеременная класса класса Quaternion.

1 Ответ

0 голосов
/ 15 мая 2018

Попробуйте:

transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(hit.normal), 0.5f);

Кажется, вы используете , 0.5f * Time.deltaTime); в качестве аргумента t. Это не сработает, потому что: t нужно перейти от 0 до 1 за то время, когда вы хотите достичь целевого вращения.

0.5f * Time.deltaTime будет колебаться при небольшом значении, различающемся в каждом кадре.

сделать переменную таймера, которая выживет при вызовах Update (). public float timer = 0f; например. Затем увеличьте значение как timer += Time.deltaTime.

Альтернатива: используйте постоянное значение, например 0.5f - при каждом вызове происходит поворот на 50% от разницы. И эта разница уменьшается, конечно. Таким образом, скорость вращения будет снижаться (может потребоваться для плавного вращения), но никогда не достигнет цели на 100%.

...