A lineáris interpoláció egy alapvető eszköz, a játékfejlesztő programozói szerszámosládánkban.
Működése és használata nagyon egyszerű bármilyen elrettentő is a neve.
Feladata, hogy kettĹ‘ adatot vegyĂtsen egy arányszám szerint.
A lineáris interpoláciĂł rövidĂtĂ©sĂ©re a Lerp szĂłt használjuk.
Color.Lerp
Ezt legegyszerűbben úgy lehet elképzelni, mintha kétféle festéket kevernénk össze, megadva azt, hogy milyen arányban használunk melyikből.
PĂ©ldául ha piros Ă©s kĂ©k szĂnt keverĂĽnk 0.8-as arányban. Az azt jelenti, hogy
pirosból veszünk 0.2 részt,
kékből veszünk 0.8 részt.
Ezt meg is tudjuk tenni Unity-ben is a Color.Lerp függvénnyel.
[SerializeField] Color colorA, colorB;
[SerializeField, Range(-1,2)] float t = 1f;
[SerializeField] Material material;
void Update()
{
material.color = Color.Lerp(colorA, colorB, t);
}A lerp függvényeknek mindig 3 bemenetük és egy kimentük van:
A visszatĂ©rĂ©s (kiment) tĂpusa mindig megegyezik az elsĹ‘ kĂ©t paramĂ©ter (bemenet) tĂpusával.
A harmadik t nevű paramĂ©ter mindig egy float tĂpusĂş szám, ami megadja milyen arányban keverjĂĽk az elsĹ‘ 2 paramĂ©tert.
Unity Lerp függvények
TöbbfĂ©le tĂpus objektumai közt tudunk lineárisan interpolálni.
Lásd a következĹ‘ interaktĂv pĂ©ldát, ahol a Ă©s b (Vector2 tĂpusĂş) pontok közt lehet lineárisan interpolálni:
Ezen kĂvĂĽl a Unity-ben tudsz mĂ©g interpolálni float számok, Vector3-ak Ă©s Quaternion-ok közt is:
float fResult = Mathf.Lerp(fa, fb, t);
Color cResult = Color.Lerp(ca, cb, t);
Vector2 v2Result = Vector2.Lerp(v2a, v2b, t);
Vector3 v3Result = Vector3.Lerp(v2a, v2b, t);
Quaternion qResult = Quaternion.Lerp(qa, qb, t);LerpUnclamped
Megfigyelheted, hogy nem csak akkor kapod vissza az elsĹ‘ (a) Ă©rtĂ©ket, ha 0-t adsz t-nek, de akkor is, ha bármi nulla alatti Ă©rtĂ©ket. UgyanĂgy 1 Ă©s minden efeletti t a második (b) Ă©rtĂ©ket adja vissza.
Példa: Lineáris interpoláció számok közt: Mathf.Lerp
Ha azt a levágást nem szeretnĂ©nk, hanem, hogy folytatĂłdjon a fĂĽggvĂ©ny a 0 Ă©s 1 Ă©rtĂ©ken kĂvĂĽl is akkor a LerpUnclamped fĂĽggvĂ©nyt használjuk. Minden eddig bemutatott Lerp fĂĽggvĂ©nynek LerpUnclamped megfelelĹ‘je:
float fResult = Mathf.LerpUnclamped(fa, fb, t);
Color cResult = Color.LerpUnclamped(ca, cb, t);
Vector2 v2Result = Vector2.LerpUnclamped(v2a, v2b, t);
Vector3 v3Result = Vector3.LerpUnclamped(v2a, v2b, t);
Quaternion qResult = Quaternion.LerpUnclamped(qa, qb, t);InverseLerp
Ha nem az 0-val szeretnénk jelölni a kezdőpontot és nem a 1-gyel a végpontot, akkor használhatjuk az Lineáris interpoláció inverse függvényét, hogy vele kiszámoljuk a Lert t paraméterét.
t = Mathf.InverseLerp(aInput, bInput, inputValue);
Color resultColor = Color.Lerp(aColorOutput, bColorOutput, t);SimĂtott (nem lineáris) interpoláciĂł
Az interpoláció tehát csak annyit jelent, hogy átmenetet képzünk egyik adatból a másikba.
Lerp esetén az átmenet mindig tökéletesen egyenletes lesz innen a “lineáris” szó. Ennek megvan az a hátránya, hogy elég szögletessé tudja tenni az átmenetet. Ez gyakran nem probléma, sőt kifejezetten elvárt, ám megoldandó feladattól függően előfordulhat, hogy nem egyenletes, ámde a végeken simább átmenetet szeretnénk elérni. Szerencsére nem csak lineárisan lehet interpolálni.
A Unity Mathf.SmoothLerp fĂĽggvĂ©nye segĂt elsimĂtani a görbe kezdeti Ă©s vĂ©gpontját.
SmoothLerp fĂĽggvĂ©ny csak számokra lĂ©tezik, hogyha egyĂ©b adattĂpusokkal akarjuk használni, akkor kombinálni kell azok Lerp fĂĽggvĂ©nyĂ©vel a következĹ‘kĂ©pp:
lerpObj.position = Vector3.Lerp(p1, p2, t);
float t2 = Mathf.SmoothStep(0, 1, t);
smoothObj.position = Vector3.Lerp(p3, p4, t2);Körkörös interpoláció
Ha szögek közt szeretnénk lineárisan interpolálni, akkor ne a Mathf.Lerp-et használjuk, hanem a Mathf.LerpAngle függvényt. Ekkor a legrövidebb utat fogja megtalálni az adott szöghöz még akkor is ha ehhez visszafelé kell haladni.
3D-s elforgatásokat reprezentálhatunk euler szögekkel Vector3 és Quaternion-nal is (Forgatás), ezért mindkét osztály tartalmaz gömbön értelmezett “Spehrical” Lerp-et, vagyis Slerp-et, ami egyenletesen szögsebességgel forgat egyik rotációból a másikba.
A Quaternion-nak van Lerp és Slerp függvénye is, a különbséget az alábbi ábra érzékelteti: