๋ฐ˜์‘ํ˜•

CSS์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ์ „ํ™˜ ํšจ๊ณผ๋ฅผ ์ œ์–ดํ•  ๋•Œ ํƒ€์ด๋ฐ ํ•จ์ˆ˜(๊ฐ€์†๋„ ๊ณก์„ )๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํƒ€์ด๋ฐ ํ•จ์ˆ˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์–ผ๋งˆ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋˜๋Š” ๋А๋ฆฌ๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ˆ˜ํ•™์ ์ธ ํ•จ์ˆ˜๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์†๋„ ๋ณ€ํ™”๋ฅผ ์ œ์–ดํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

Tailwind CSS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ease-in, ease-out, ease-in-out ๋“ฑ ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ๊ฐ€์†๋„ ๊ณก์„ ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<!-- 
transition-timing-function: cubic-bezier(0.4, 0, 1, 1); 
transition-duration: 300ms;
-->
<button class="ease-in duration-300 ...">Button A</button>

 

์˜ˆ๋ฅผ ๋“ค์–ด ease๋Š” ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์‹œ์ž‘ํ•ด์„œ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋๋‚˜๊ณ (์ผ๋ฐ˜์ ์ธ ๊ฐ€์†๋„ ๊ณก์„ ), ease-in์€ ๋А๋ฆฌ๊ฒŒ ์‹œ์ž‘ํ•ด์„œ ๋น ๋ฅด๊ฒŒ ๋๋‚˜๋Š” ํšจ๊ณผ๋ฅผ ์ค„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์‚ฌ์‹ค ease, ease-in, ease-out, ease-in-out ๋“ฑ์€ CSS์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํƒ€์ด๋ฐ ํ•จ์ˆ˜(easing function) ํ”„๋ฆฌ์…‹์ด๋‹ค. ๊ฐ ๊ฐ’์€ ์•„๋ž˜์ฒ˜๋Ÿผ cubic-bezier ๊ณก์„ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

ease           /* cubic-bezier(0.25, 0.1, 0.25, 1) */
ease-in        /* cubic-bezier(0.42, 0, 1, 1) */
ease-out       /* cubic-bezier(0, 0, 0.58, 1) */
ease-in-out    /* cubic-bezier(0.42, 0, 0.58, 1) */
...

 

๋ฒ ์ง€์— ๊ณก์„ ์€ ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค์—์„œ ๋ถ€๋“œ๋Ÿฌ์šด ๊ณก์„ ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜ํ•™์  ๊ณก์„ ์œผ๋กœ, ์กฐ์ ˆ์ (control point)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ •์˜๋œ๋‹ค. n๊ฐœ์˜ ์กฐ์ ˆ์ ์ด ์ฃผ์–ด์ง€๋ฉด n-1์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์™ผ์ชฝ๋ถ€ํ„ฐ 1์ฐจ(์กฐ์ ˆ์  2๊ฐœ), 2์ฐจ(์กฐ์ ˆ์  3๊ฐœ), 3์ฐจ(์กฐ์ ˆ์  4๊ฐœ) ๋ฒ ์ง€์— ๊ณก์„ . Image via JavaScript Info

 

CSS์—์„œ ์‚ฌ์šฉํ•˜๋Š” cubic-bezier() ํ•จ์ˆ˜๋Š” 4๊ฐœ์˜ ์กฐ์ ˆ์ (Pโ‚€, Pโ‚, Pโ‚‚, Pโ‚ƒ)์œผ๋กœ ๊ตฌ์„ฑ๋œ 3์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. ์ด ์ค‘ ์‹œ์ž‘์ (Pโ‚€)๊ณผ ๋์ (Pโ‚ƒ)์€ ํ•ญ์ƒ (0, 0)๊ณผ (1, 1)๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ๋Š” ์ค‘๊ฐ„์— ์žˆ๋Š” ๋‘ ์ œ์–ด์ (Pโ‚, Pโ‚‚)๋งŒ ์ง์ ‘ ์„ค์ •ํ•œ๋‹ค.

/* cubic-bezier(P1.x, P1.y, P2.x, P2.y) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ */
transition: width 1s cubic-bezier(0.12, 0.83, 0.92, 1);

/* x ์ขŒํ‘œ(์ง€์†์‹œ๊ฐ„)๋Š” ๋ฐ˜๋“œ์‹œ [0, 1] ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•จ */
cubic-bezier(0.25, 0.1, 0.75, 1.0) /* โœ… */
cubic-bezier(1.5, 0.1, 0.75, 1.0)  /* โŒ */

/* y ์ขŒํ‘œ(์ง„ํ–‰๋ฅ )๋Š” [0, 1] ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋ฐ”์šด์‹ฑ ํšจ๊ณผ ์ƒ์„ฑ */
cubic-bezier(0.1, -0.6, 0.2, 2.0)

 

ํ•œํŽธ, ๋ฒ ์ง€์— ๊ณก์„ ์€ ์นด์Šคํ…”์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์–ด์ง„ ์กฐ์ ˆ์ ์„ ์„ ๋ถ„(์‹œ์ž‘์ ๊ณผ ๋์ ์ด ์ •ํ•ด์ง„ ์ง์„ )์œผ๋กœ ์—ฐ๊ฒฐํ•œ ํ›„, ๊ฐ ์„ ๋ถ„์„ ๋™์ผํ•œ ๋น„์œจ t๋กœ ๋‚ด๋ถ„(์„ ๋ถ„์„ ์ฃผ์–ด์ง„ ๋น„์œจ๋กœ ๋‚˜๋ˆ”; ์„ ํ˜• ๋ณด๊ฐ„)ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ ๋“ค์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. ๋‘ ์  ์‚ฌ์ด์˜ ์„ ๋ถ„์„ ํŠน์ • ๋น„์œจ t๋กœ ๋‚˜๋ˆ„๋Š” ์—ฐ์‚ฐ์€ ๋‚ด๋ถ„ ํ˜น์€ ์„ ํ˜• ๋ณด๊ฐ„์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์ ์˜ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ๋งŒ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ์„ ํ˜• ๋ณด๊ฐ„์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ์ตœ์ข…์ ์œผ๋กœ ๋‚จ์€ ์ ์ด ๋ฒ ์ง€์— ๊ณก์„  ์œ„์˜ ์ขŒํ‘œ๊ฐ€ ๋œ๋‹ค. ์ฆ‰, ์นด์Šคํ…”์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์„ ํ˜• ๋ณด๊ฐ„์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๊ณก์„ ์˜ ์ ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๊ธ€๋งŒ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ 2์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ๋ถ€ํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด์ž.

 

๐Ÿ” ๋ณด๊ฐ„ (ๆ’ๅ€ผ, Interpolation)

๋ณด๊ฐ„์€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ง€์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ๊ทธ ์‚ฌ์ด์˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฐ’์„ ์ถ”๋ก ํ•˜๋Š” ๋ชจ๋“  ๊ณผ์ •์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ํ•œ์ž ๋œป ๊ทธ๋Œ€๋กœ ์‚ฌ์ด(้–“)๋ฅผ ๋ณด์ถฉ(่ฃœ)ํ•œ๋‹ค๋Š” ์˜๋ฏธ. ์˜ˆ๋ฅผ ๋“ค์–ด $x=0$์ผ ๋•Œ ๊ฐ’์ด $0$์ด๊ณ  $x=10$์ผ ๋•Œ ๊ฐ’์ด $100$์ด๋ผ๋ฉด, ๊ทธ ์‚ฌ์ด์ธ $x=3$์ด๋‚˜ $x=7$์˜ ๊ฐ’์„ ์ถ”์ •ํ•˜๋Š” ๊ณผ์ •์ด ๋ฐ”๋กœ ๋ณด๊ฐ„์ด๋‹ค.

 

๐Ÿ” ์„ ํ˜• ๋ณด๊ฐ„ (็บฟๆ€งๆ’ๅ€ผ, Linear Interpolation)

์„ ํ˜• ๋ณด๊ฐ„์€ ์ด๋Ÿฌํ•œ ๋ณด๊ฐ„ ๊ธฐ๋ฒ• ์ค‘ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด๊ณ  ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•. ์„ ํ˜• ๋ณด๊ฐ„์€ ์•Œ๋ ค์ง„ ๋‘ ์ ์„ ์ง์„ ์œผ๋กœ ์ž‡๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๊ทธ ์ง์„  ์œ„์˜ ์ค‘๊ฐ„ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ค„์—ฌ์„œ Lerp๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ์ฐธ๊ณ ๋กœ ์„ ํ˜•์€ ์ง์„  ํ˜•ํƒœ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

2์ฐจ ๋ฒ ์ง€์— ๊ณก์„ 


๋จผ์ € A, B, C ์กฐ์ ˆ์  3๊ฐœ๋ฅผ ์ง์„ ์œผ๋กœ ์ž‡๋Š”๋‹ค. ๊ทธ๋Ÿผ AB, BC 2๊ฐœ์˜ ์„ ๋ถ„์ด ์ƒ๊ธด๋‹ค.

 

๊ฐ ์„ ๋ถ„์„ ๋™์ผํ•œ ๋น„์œจ t(0 ≤ t ≤ 1)๋กœ ๋‚˜๋ˆˆ๋‹ค(๋‚ด๋ถ„). ์˜ˆ๋ฅผ ๋“ค์–ด t๊ฐ€ 0.3์ด๋ผ๋ฉด A์—์„œ B ๋ฐฉํ–ฅ์œผ๋กœ 30% ์ด๋™ํ•œ ์ง€์  D์™€, B์—์„œ C ๋ฐฉํ–ฅ์œผ๋กœ 30% ์ด๋™ํ•œ ์ง€์  E๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

์  D์™€ E๋ฅผ ๋‹ค์‹œ ์ง์„ ์œผ๋กœ ์ด์–ด ์ƒˆ๋กœ์šด ์„ ๋ถ„ DE๋ฅผ ๋งŒ๋“ ๋‹ค.

 

์ด ์„ ๋ถ„์—์„œ ๋‹ค์‹œ t๋งŒํผ ์ด๋™ํ•œ ์ง€์  F๋ฅผ ๊ตฌํ•œ๋‹ค. ์ ์ด F ํ•˜๋‚˜๋งŒ ๋‚จ์•˜์œผ๋ฏ€๋กœ ์ด ์ง€์ ์ด ๋ฒ ์ง€์— ๊ณก์„ ์˜ ์ขŒํ‘œ๊ฐ€ ๋œ๋‹ค.

 

t ๊ฐ’์„ 0๋ถ€ํ„ฐ 1๊นŒ์ง€ ์กฐ๊ธˆ์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ(0.05, 0.1, …, 0.95, 1) ์œ„ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ ์ด ์ƒ์„ฑ๋˜๊ณ , ์ด ์ ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ด์œผ๋ฉด 2์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์ด ์™„์„ฑ๋œ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œํŽœ์—์„œ Start Animation ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ณก์„ ์ด ๊ทธ๋ ค์ง€๋Š” ๊ณผ์ •์„ ์ง์ ‘ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

3์ฐจ ๋ฒ ์ง€์— ๊ณก์„ 


3์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์€ ์กฐ์ ˆ์  4๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ณก์„ ์„ ๋งŒ๋“œ๋Š” ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” 2์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ์กฐ์ ˆ์ ์ด ํ•˜๋‚˜ ๋Š˜์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์„ ํ˜• ๋ณด๊ฐ„ ๊ณผ์ •์ด ํ•œ ๋ฒˆ ๋” ๋ฐ˜๋ณต๋œ๋‹ค.

 

๋จผ์ € A, B, C, D ์กฐ์ ˆ์  4๊ฐœ๋ฅผ ์ง์„ ์œผ๋กœ ์ž‡๋Š”๋‹ค.

 

AB, BC, CD ๊ฐ ์„ ๋ถ„์„ ๋™์ผํ•œ ๋น„์œจ t๋กœ ๋‚ด๋ถ„ํ•œ๋‹ค.

 

๋‚ด๋ถ„ํ•˜์—ฌ ์ƒ๊ธด ์  E, F, G๋ฅผ ์ด์–ด ์ƒˆ๋กœ์šด ์„ ๋ถ„ EF, FG์„ ๋งŒ๋“ ๋‹ค.

 

์ƒˆ๋กœ์šด ์„ ๋ถ„์„ ๋‹ค์‹œ t๋กœ ๋‚ด๋ถ„ํ•˜์—ฌ ์  H, I๋ฅผ ๋งŒ๋“ ๋‹ค.

 

๋‚ด๋ถ„ํ•˜์—ฌ ์ƒ๊ธด ์ ์„ ์ง์„ ์œผ๋กœ ์ด์–ด ์„ ๋ถ„ HI๋ฅผ ๋งŒ๋“ ๋‹ค.

 

์„ ๋ถ„์„ ๋‹ค์‹œ t๋งŒํผ ๋‚ด๋ถ„ํ•˜์—ฌ ์  J๋ฅผ ๊ตฌํ•œ๋‹ค. ์ ์ด 1๊ฐœ๋งŒ ๋‚จ์•˜์œผ๋ฏ€๋กœ ์ด ์ง€์ ์ด ๋ฒ ์ง€์–ด ๊ณก์„ ์˜ ์ขŒํ‘œ๊ฐ€ ๋œ๋‹ค.

 

3์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ์ž์„ธํ•œ ๊ณผ์ •์€ ์•„๋ž˜ ์ฝ”๋“œํŽœ์„ ์ฐธ๊ณ ํ•˜์ž. 

 

 

 

๋ฒ ์ง€์— ๊ณก์„  ์ˆ˜ํ•™ ๊ณต์‹ ์ดํ•ดํ•˜๊ธฐ


1์ฐจ ๋ฒ ์ง€์— ๊ณก์„  (์กฐ์ ˆ์  2๊ฐœ)

1์ฐจ ๋ฒ ์ง€์— ๊ณก์„ (์กฐ์ ˆ์  2๊ฐœ)์€ ์•„๋ž˜ ์ˆ˜ํ•™ ๊ณต์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. — ์„ ํ˜• ๋ณด๊ฐ„ ๊ณต์‹

$$ P = (1-t)P_1 + tP_2 $$

 

$P_1$์€ ์‹œ์ž‘์ , $P_2$๋Š” ๋์ , $t$๋Š” ์ง„ํ–‰๋ฅ (0 ์ด์ƒ 1 ์ดํ•˜, 0์ด๋ฉด ์ถœ๋ฐœ 1์ด๋ฉด ๋„์ฐฉ), $P$๋Š” $t$์— ๋”ฐ๋ผ $P_1$์—์„œ $P_2$๋กœ ์ด๋™ํ•œ ์œ„์น˜(์ง„ํ–‰๋ฅ )๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด $t = 0$์ผ ๋•Œ $P$๋Š” $P_1$๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค.

$$ \begin{aligned} t &= 0 \\ P &= (1 - 0)P_1 + 0 \cdot P_2 \\ &= 1 \cdot P_1 + 0 \\ &= P_1 \end{aligned} $$

 

$t = 0.3$์€ ์ถœ๋ฐœ์  $P_1$์—์„œ ๋์  $P_2$ ๋ฐฉํ–ฅ์œผ๋กœ ์ „์ฒด ๊ฑฐ๋ฆฌ์˜ 30% ๋งŒํผ ์ด๋™ํ•œ ์ง€์ ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ์ง€์ ์˜ ์œ„์น˜ $P$๋Š” $P_1$๊ณผ $P_2$ ์œ„์น˜์— ๊ฐ๊ฐ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณฑํ•˜์—ฌ ๋”ํ•˜๋Š” ๊ฐ€์ค‘ ํ‰๊ท (weighted average) ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์ค‘ ํ‰๊ท ์€ ์œ„์น˜๊ฐ€ ๋” ๊ฐ€๊นŒ์šด ์ง€์ ์— ๋” ํฐ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค. $t = 0.3$ ์ผ ๋•Œ $P$๋Š” $P_1$์—์„œ 30% ๋งŒํผ ๋–จ์–ด์ ธ ์žˆ๊ณ , $P_2$์— 70% ๋งŒํผ ๋–จ์–ด์ ธ ์žˆ์œผ๋ฏ€๋กœ $P_1$์— ๋” ๊ฐ€๊น๋‹ค. ๋”ฐ๋ผ์„œ $P_1$์— ๊ฐ€์ค‘์น˜๋ฅผ 70%, $P_2$์— ๊ฐ€์ค‘์น˜ 30%๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ์ ์œผ๋กœ $P = 0.7 \cdot P_1 + 0.3 \cdot P_2$ ์ˆ˜์‹์ด ์™„์„ฑ๋œ๋‹ค.

$$ \begin{aligned} t &= 0.3 \\ P &= (1 - 0.3)P_1 + 0.3 \cdot P_2 \\ &= 0.7 \cdot P_1 + 0.3 \cdot P_2 \end{aligned} $$

 

$t = 1$์ผ ๋•Œ $P$๋Š” $P_2$์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค.

$$ \begin{aligned} t &= 1 \\ P &= (1 - 1)P_1 + 1 \cdot P_2 \\ &= 0 \cdot P_1 + 1 \cdot P_2 \\ &= 0 + P_2 \\ &= P_2 \end{aligned} $$

 

1์ฐจ ๋ฒ ์ง€์— ๊ณก์„ (์„ ํ˜• ๋ณด๊ฐ„) ๊ณต์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์‹์„ ์ „๊ฐœํ•˜์—ฌ ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

$$ \begin{aligned} P &= P_1-tP_1+tP_2 \\ &= P_1+tP_2-tP_1 \\ &= P_1+t(P_2-P_1) \end{aligned} $$

 

2์ฐจ ๋ฒ ์ง€์— ๊ณก์„  (์กฐ์ ˆ์  3๊ฐœ)

์กฐ์ ˆ์ ์ด 3๊ฐœ์ผ ๋•Œ ๊ณต์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 1์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์˜ ์›๋ฆฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•œ ๊ฒƒ์œผ๋กœ ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ๋Š” ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ ์•„๋ž˜ ๊ณต์‹์ด ๋„์ถœ๋˜๋Š”์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.

$$ P = (1 - t)^2 P_1 + 2(1 - t)t P_2 + t^2 P_3 $$

 

๋จผ์ € 2์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์— ํ•„์š”ํ•œ 3๊ฐœ์˜ ์กฐ์ ˆ์ —์‹œ์ž‘ $P_1$, ์ค‘๊ฐ„ $P_2$, ๋ $P_3$—์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ์ด ์„ธ ์ ์„ ์ด์šฉํ•ด ๋‘ ๊ฐœ์˜ ๋™์ ์ธ ์ ์„ ๋งŒ๋“ ๋‹ค.

 

  • $P_1$์—์„œ $P_2$๋กœ ์ด๋™ํ•˜๋Š” ์  $Q_1 = (1-t)P_1+tP_2$
  • $P_2$์—์„œ $P_3$์œผ๋กœ ์ด๋™ํ•˜๋Š” ์  $Q_2 = (1-t)P_2+tP_3$

 

๋งค๊ฐœ๋ณ€์ˆ˜ $t$๊ฐ€ 0์—์„œ 1๋กœ ๋ณ€ํ•จ์— ๋”ฐ๋ผ, $Q_1$์€ $P_1$์—์„œ $P_2$๋กœ, $Q_2$๋Š” $P_2$์—์„œ $P_3$์œผ๋กœ ์ผ์ •ํ•˜๊ฒŒ(์„ ํ˜•์ ) ์ด๋™ํ•œ๋‹ค. 2์ฐจ ๋ฒ ์ง€์— ๊ณก์„  ์œ„์˜ ์ตœ์ข…์ ์ธ ์  $P$๋Š” ์ด๋ ‡๊ฒŒ ์›€์ง์ด๋Š” ๋‘ ์  $Q_1$, $Q_2$๋ฅผ ๋‹ค์‹œ $t$์— ๋Œ€ํ•ด ์„ ํ˜• ๋ณด๊ฐ„ํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, $Q_1$์„ ์‹œ์ž‘์ ์œผ๋กœ $Q_2$๋ฅผ ๋์ ์œผ๋กœ ๊ฐ–๋Š” ๋˜ ๋‹ค๋ฅธ 1์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

$$ P = (1-t)Q_1 + tQ_2 $$

 

์ด์ œ ์œ„ ๊ณต์‹์— $Q_1$๊ณผ $Q_2$ ์ •์˜๋ฅผ ๊ฐ๊ฐ ๋Œ€์ž…ํ•ด ๋ณด์ž.

$$ \begin{aligned} P &= (1-t){\color{cyan}Q_1} + {\color{orange}tQ_2} \\ &= (1-t){\color{cyan}((1-t)P_1 + tP_2)} + {\color{orange}t((1-t)P_2 + tP_3)} \end{aligned} $$

 

๋ถ„๋ฐฐ๋ฒ•์น™์„ ์ด์šฉํ•ด ๊ณฑ์…ˆ์„ ์ „๊ฐœํ•œ๋‹ค.

$$ P = {\color{cyan}(1-t)(1-t)P_1 + (1-t)tP_2} + {\color{orange}t(1-t)P_2 + t \cdot tP_3} $$

 

๊ฑฐ๋“ญ์ œ๊ณฑ(²)์„ ์‚ฌ์šฉํ•ด์„œ ์‹์„ ์ •๋ฆฌํ•œ๋‹ค.

$$ P = {\color{yellowgreen}(1-t)^2P_1} + (1-t)tP_2 + t(1-t)P_2 + {\color{yellowgreen}t^2P_3} $$

 

๊ฐ€์šด๋ฐ ์žˆ๋Š” 2๊ฐœ์˜ $P_2$ ํ•ญ์€ ๊ณฑ์˜ ์ˆœ์„œ๋งŒ ๋‹ค๋ฅผ ๋ฟ ๋™์ผํ•˜๋ฏ€๋กœ(๋™๋ฅ˜ํ•ญ) ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ค€๋‹ค. ๊ทธ๋Ÿผ 2์ฐจ ๋ฒ ์ง€์— ๊ณก์„ ์˜ ๊ณต์‹์ด ์™„์„ฑ๋œ๋‹ค.

$$ P = (1-t)^2P_1+{\color{yellowgreen}2(1-t)tP_2}+t^2P_3 $$

 

3์ฐจ, 4์ฐจ ๋“ฑ ๋” ๋†’์€ ์ฐจ์ˆ˜์˜ ๋ฒ ์ง€์— ๊ณก์„ ๋„ ์œ„์™€ ๋™์ผํ•œ ์›๋ฆฌ๊ฐ€ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉ๋˜์–ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

์ฐธ๊ณ ๋กœ ๊ฐ ์กฐ์ ˆ์  ์•ž์— ๊ณฑํ•ด์ง„ $(1-t)^2$, $2(1-t)t$, $t^2$ ๊ฐ™์€ ํ•ญ๋“ค์„ ๋ฒˆ์Šคํƒ€์ธ ๊ธฐ์ € ๋‹คํ•ญ์‹(Bernstein basis polynomials) ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ด๋Ÿฌํ•œ ํ•ญ๋“ค์€ $t$ ๊ฐ’์— ๋”ฐ๋ผ ๊ฐ ์กฐ์ ˆ์ ์ด ๊ณก์„  ์œ„์˜ ์  $P$์— ์–ผ๋งˆ๋‚˜ ํฐ ์˜ํ–ฅ(๊ฐ€์ค‘์น˜)์„ ๋ฏธ์น˜๋Š”์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

 

 

๋ฒ ์ง€์— ๊ณก์„ ์˜ ๊ธฐ์šธ๊ธฐ


์•„๋ž˜๋Š” ๋‹ค์–‘ํ•œ ๋ฒ ์ง€์— ๊ณก์„  ์˜ˆ์‹œ.

Image via Josh Collins Worth

 

๋ฒ ์ง€์— ๊ณก์„  ๊ทธ๋ž˜ํ”„์—์„œ x์ถ•์€ ์‹œ๊ฐ„์˜ ํ๋ฆ„(์ง€์† ์‹œ๊ฐ„), y์ถ•์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ง„ํ–‰๋ฅ ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋•Œ ๊ณก์„ ์˜ ๊ธฐ์šธ๊ธฐ๊ฐ€ ๊ทธ ์ˆœ๊ฐ„์˜ ์†๋„๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์šธ๊ธฐ๊ฐ€ ๊ฐ€ํŒŒ๋ฅผ์ˆ˜๋ก ๋น ๋ฅด๊ฒŒ, ์™„๋งŒํ• ์ˆ˜๋ก ๋А๋ฆฌ๊ฒŒ ์›€์ง์ด๋Š” ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

Image via Josh Collins Worth

 

x์ถ•์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ „์ฒด ์ง€์†์‹œ๊ฐ„์„ 1๋กœ ์ •๊ทœํ™”ํ–ˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ 0~1 ๋ฒ”์œ„๋กœ ์ง€์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ, y์ถ•์€ ๋ชฉํ‘œ๊ฐ’ 1์„ ๋„˜์–ด์„ฐ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ํŒจํ„ด์„ ํ™œ์šฉํ•ด์„œ ๋ฐ”์šด์Šค ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

[0 → 0.5 → 0.8] → [1.1] → [0.95 → 1.02 → 0.98] → [1.0]
     ๊ฐ€์†๊ตฌ๊ฐ„       ์˜ค๋ฒ„์ŠˆํŠธ         ๋ฐ”์šด์Šค              ๋„๋‹ฌ

 

  1. ๊ฐ€์† ๊ตฌ๊ฐ„ (0 → 0.8): ๊ธฐ์šธ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์ ์  ๋นจ๋ผ์ง
  2. ์˜ค๋ฒ„์ŠˆํŠธ (1.1): y ๊ฐ’์ด 1.1์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ˆœ๊ฐ„์ ์œผ๋กœ ์†๋„๊ฐ€ 0์ด ๋œ ํ›„ ์šด๋™ ๋ฐฉํ–ฅ ์ „ํ™˜
  3. ๋ฐ”์šด์Šค (0.95 → 1.02 → 0.98): ๋ชฉํ‘œ๊ฐ’์„ ์ค‘์‹ฌ์œผ๋กœ y๊ฐ’์ด ์œ„์•„๋ž˜๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ์ด๋Š” ๊ตฌ๊ฐ„
  4. ๋„๋‹ฌ (1.0): ๋ชฉํ‘œ๊ฐ’์— ๋„๋‹ฌํ•˜์—ฌ ๋ฉˆ์ถ”๋Š” ๊ตฌ๊ฐ„

 

์˜ˆ๋ฅผ ๋“ค์–ด cubic-bezier(0.34, 1.56, 0.64, 1) ์ฒ˜๋Ÿผ ์„ค์ •ํ•˜๋ฉด ์˜ค๋ฒ„์ŠˆํŠธ ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์˜ค๋ฒ„์ŠˆํŠธ(Overshoot)๋Š” ๋ชฉํ‘œ ์ง€์ (1)์„ ์˜๋„์ ์œผ๋กœ ๋„˜์–ด๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๋ชฉํ‘œ ์ง€์ ์œผ๋กœ ๋˜๋Œ์•„์˜ค๋Š” ์›€์ง์ž„์ด๊ณ , ์–ธ๋”์ŠˆํŠธ(Undershoot)๋Š” ๋ฐ˜๋Œ€๋กœ ์‹œ์ž‘ ์ง€์ (0) ๋ณด๋‹ค ๋” ๋’ค๋กœ ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๋ชฉํ‘œ ์ง€์ ์œผ๋กœ ํ–ฅํ•˜๋Š” ์›€์ง์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

๋ ˆํผ๋Ÿฐ์Šค


๋ฐ˜์‘ํ˜•