Lerp 實現勻速運動

2021-07-03 17:42:13 字數 1523 閱讀 2232

lerp函式在mathf,vector3, 等類中都有,用法都類似,作用都是按照百分比取得從乙個值過度到另外乙個值的中間值。下面說的內容針對各中類的lerp函式都是通用的。

update()

說是「誤用」,其實也不完全正確,這種用法是可以工作的,但是常常不是大家的真正需求,很多時候大家使用lerp都是想達到勻速運動的效果,但如下「誤用」卻讓物件以逐漸降低的速度運動。

首先,上述「誤用」是這樣工作的:每幀都重新獲取物體當前的位置,計算物體和目標距離的差距,再按照當前幀的持續時間(當做乙個百分比)來移動這個比例的位置。因此如果目標位置始終是固定的,那麼整體運動是緩動的,先快後慢。這樣的效果乍一看還不錯,但其實是有一些問題的:因為每秒鐘都以固定的比例靠近目標位置,所以運動速度會以固定的比例逐漸降低,只要運算精度夠高,運動永遠達不到目標,且運算始終在進行。如果確實需要這樣做,那麼我們需要加上乙個閾值,當與目標距離小於這個閾值時,就直接把物體的位置設定為目標位置。這個閾值的大小設定要合適,太大了在後面階段會感覺到明顯的跳躍,太小了會浪費運算時間。

這裡說明一下,如果上述效果就是我們想達到的目標,那麼用time.deltatime作為第三個引數在這個情況下是有道理的,因為每幀時間不同,為了保證單位時間內運動的百分比是一致的(達到平滑緩動的效果),需要用time.delttime介入。

如果你是誤打誤撞實現了緩動效果,並且覺得效果不錯就沒有再深究了,那麼建議你繼續往下看看。

先看**:

float speed = 2.0f;

//什麼時候開始運動

float starttime = 2.0f;

//起始x位置

float startx = 0.0f;

//結束x位置

float endx = 0.0f;

void update()

一定要理解清楚mathf.lerp(float a, float b, float t)第三個引數t的意義,它是乙個百分比,最小值有效值是0,最大有效值是1,如果超出了1,就取1,小於0則取0.

它表示從a到b之間,按照t這個百分比來取值,例如a是0,b是100,如果t是0.2,則該函式返回的值是20,如果t是1,該函式返回的值為100.

勻速運動的要點是起始值和結束值都是固定好的,不會隨著運動而發生變化。

time.time就是系統執行時間,也就是這個程式開始到現在的時長。

(time.time - starttime),上面例子中starttime是2.0f,那麼這個式子的取值一開始是-2,2秒時變成0,3秒時變成1,先假設沒有乘以speed這個值,整個運動過程會在2秒開始,3秒結束。

物體運動的速度是距離差(在本例中是10.0f)除以1秒。乘以乙個speed以後,實際上是在調整整體的運動時間。

假設speed為0.1f,則運動的時間變為2秒開始12秒結束,執行時間變成了10,則速度變成原先的1/10,

同理,假設speed 為10f,則運動時間變為2秒開始2.1秒結束,速度變成原先的10倍。

JS勻速運動

所謂的勻速運動就是速度不變的,比如無縫滑動展示就是勻速運動.這種運動的特點就是簡單,呆板,不炫麗.例子 div勻速運動.效果如圖 要注意的地方 1.有些時候不能精確的停在某個位置,所以當距離目標位置很近的時候直接強行把它移到到目標位置就可以了.2.開啟定時器的時候一定要先清除原來的定時器,不然速度會...

js勻速運動

勻速運動 封裝勻速運動原理 設定定時器,將傳入的ele,設定乙個速度,使用定時器獲取當前時間的乙個位置,加上速度值,給回節點,當節點到達目標位置,判斷給他清除定時器。github 下面封裝好的勻速運動的 勻速運動 function getstyle obj,attr function dogo ob...

勻速運動與緩速運動

1.勻速運動 勻速運動的步驟 1.開啟定時器之前,清楚原本的定時器 clearinterval ele.timeid 2.獲取當前位置 var currentleft ele.offsetleft 3.開啟定時器 ele.timeid setinterval function 50 4.移動盒子 c...