2016-03-07 94 views
1

我創建了一個協程來處理我的相機移動和方向看,在這種協程,我有:統一線性插值和球面線性插值不動的順利

public IEnumerator MoveCameraLookAtObject(Transform _cameraTransform, Vector3 startPos, Vector3 endPos, Vector3 lookAt, float time) 
{ 
    // Loop through a timed based situation. 
    for (float i = 0f; i <= 1.0f; i += Time.deltaTime/time) 
    { 
     // Lerp the Movement. 
     _cameraTransform.position = Vector3.Lerp(startPos, endPos, i); 
     // Slerp the rotation. 
     Vector3 relativePos = lookAt - _cameraTransform.position; 
     Quaternion rotation = Quaternion.LookRotation(relativePos); 
     _cameraTransform.rotation = Quaternion.Slerp(_cameraTransform.rotation, rotation, i); 
     } 
     yield return null; 
    } 
} 

的問題是,當我真正感到Lerping和Slerping它看起來可怕並且不流暢的東西。我很困惑我做錯了什麼,因爲我花了好幾天的時間來想清楚這一點。我看着Lerp and Slerp Question,看到這幾乎是同樣的問題,但人們需要我已經有了答案。

回答

3

這將是更多的東西像這樣

public IEnumerator MoveCameraLookAtObject(
    Transform _cameraTransform, 
    Vector3 startPos, Vector3 endPos, Vector3 lookAt, float time) 
{ 
float totalTime = 1.25f; // or whatever 

float startTime = Time.time; 
float endTime = startTime + totalTime; 

startPos = etc etc 
endPos = etc etc 

startROTATION = ... 
endROTATION = ... 
// calculate those ONLY OUT HERE!!! not in the loop 

while (Time.time < endTime) 
    { 
    float timeSoFar = Time.time - startTime; 
    float fractionTime = timeSoFar/totalTime; 

    //do NOT USE underscores in variable names 
    cameraTransform.position = 
    Vector3.Lerp(startPos, endPos, fractionTime); 

    cameraTransform.rotation = 
    Quaternion.Slerp(startROTATION, endROTATION, fractionTime); 
    yield return null; // this goes IN HERE 
    } 
} 

在與JUST lerping的位置的第一測試,然後嘗試扭曲!乾杯

+0

感謝您的回覆,但爲什麼我不計算循環中的旋轉,如果我的對象將移動?由於我的目標正在朝着它的方向前進,所以它一直在變化。 – JoeyL

+0

哦,等等,我想我可以得到最終位置,然後從那裏看角度。讓我試試這個速度真快。 – JoeyL

+0

老兄,如果你剛剛開始,我會鼓勵你嘗試一下上面顯示的「正常方式」。你可以看到100000例如何正確使用它(如上所述)。一旦你有豐富的經驗,你可以看看變化!說實話,我不能解釋爲什麼你不這樣做「內循環」:)你會完成理解,一旦你做了幾次。請享用! – Fattie