2016-03-07 70 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