我正在旋轉相機以使用四元數查看目標物件。我正在使用 Quaternion.LookRotation 和 Quaternion.Slerp 使相機在協程內平滑旋轉。不幸的是,相機在旋轉時會抖動很多。如何使用當前代碼使旋轉平滑?
Quaternion targetRotation;
public Transform lookAtObject;
IEnumerator RotateTowardsTarget () {
var duration = 2.0f;
for (float t = 0.0f; t < duration; t = Time.deltaTime) {
targetRotation = Quaternion.LookRotation (lookAtObject.position - transform.position);
transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, t / duration);
yield return null;
}
}
uj5u.com熱心網友回復:
您當前始終以朝向目標的當前旋轉開始 lerp。
在您的用例中,您寧愿做的是存盤初始旋轉,而是在初始旋轉和目標旋轉之間進行插值,例如
IEnumerator RotateTowardsTarget ()
{
var duration = 2.0;
// store the initial and target rotation once
var startRotation = transform.rotation;
var targetRotation = Quaternion.LookRotation (lookAtObject.position - transform.position);
for (var timePassed = 0.0f; timePassed < duration; timePassed = Time.deltaTime)
{
var factor = timePassed / duration;
// optionally add ease-in and -out
//factor = Mathf.SmoothStep(0, 1, factor);
transform.rotation = Quaternion.Slerp (startRotation, targetRotation, factor);
yield return null;
}
// just to be sure to end up with clean values
transform.rotation = targetRotation;
}
這將使相機在 2 秒內從當前旋轉到新的線性旋轉
uj5u.com熱心網友回復:
Slerp 將第三個引數作為進度而不是您可以執行此操作的實際時間
void Update () {
StartCoroutine(RotateOverTime(transform.rotation,
lookAtObject.rotation, 1f / speed));
}
IEnumerator RotateOverTime (Quaternion originalRotation, Quaternion
finalRotation, float duration) {
if (duration > 0f) {
float startTime = Time.time;
float endTime = startTime duration;
transform.rotation = originalRotation;
yield return null;
while (Time.time < endTime) {
float progress = (Time.time - startTime) / duration;
// progress will equal 0 at startTime, 1 at endTime.
transform.rotation = Quaternion.Slerp (originalRotation,
finalRotation, progress);
yield return null;
}
}
transform.rotation = finalRotation;
}
您現在可以以秒為單位發送持續時間
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/362709.html
上一篇:“AudioSource”不包含Unity中“PlayOneShot”的定義
下一篇:在php中格式化整數或字串
