Lerp功能
- 在unity中可以用于物體到達(dá)另外一個(gè)目標(biāo)物體之間進(jìn)行平滑過(guò)渡運(yùn)動(dòng)效果。
- 函數(shù)原型為L(zhǎng)erp(a,b,t);內(nèi)部實(shí)現(xiàn)為y = b+(1-t)*a;其中t被clamp在了[0,1],也就是說(shuō)最小為0,最大為1.
- 一般的用法為
transform.position = Vector3.Lerp(transform.position,target.position,Time.detlaTime);
這種方式可以讓物體在從開(kāi)始位置平滑移動(dòng)到目標(biāo)位置,但是運(yùn)動(dòng)的方式是先快后慢,不是勻速過(guò)去的。
- 如果采用Lerp方法但又要求勻速計(jì)算的話,一種方法是確定起始點(diǎn)與結(jié)束點(diǎn)為固定值,t為勻速增加的值,可以按照時(shí)間增加的比例如http://www.itdecent.cn/p/bb780b91e192;也可以按照距離比例等。另外方法是根據(jù)Lerp的實(shí)現(xiàn)公式來(lái)考慮,因?yàn)閥=Lerp(from,to,t) = from+(to-from)*t,因?yàn)槊看蝔rom在變,所以造成Lerp沒(méi)有勻速,如果將t包含1/(to-from),也可以實(shí)現(xiàn)勻速。
- 針對(duì)自己想到的方法相關(guān)代碼如下:其中timeNeed是外部設(shè)置的在t時(shí)間內(nèi)滑動(dòng)到target目標(biāo)。雖然算法最后一幀會(huì)直接到target上,但是整體是按照勻速通過(guò)
void Update () {
if(Input.GetKeyDown(KeyCode.Space))
{
isLerp = true;
costTime = 0.0f;
}
if (isLerp == true)
{
float distance2 = Vector3.Distance (transform.position, target.position);
float lerpT = distance*Time.deltaTime/ (timeNeed*distance2);
transform.position = Vector3.Lerp (transform.position, target.position, lerpT);
costTime += Time.deltaTime;
if(transform.position == target.position)
{
isLerp = false;
Debug.Log (costTime);
}
}
}