• Mindscape ๐Ÿ”ฅ
    • Playlist ๐ŸŽง
    • Vim ์‚ฌ์šฉ ๋งค๋‰ด์–ผ
  • ๐Ÿง  Algorithm

    • Python ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํŒ
    • 1966๋ฒˆ: ํ”„๋ฆฐํ„ฐ ํ
    • 1018๋ฒˆ: ์ฒด์ŠคํŒ ๋‹ค์‹œ ์น ํ•˜๊ธฐ
  • ๐Ÿ’ฐ Finance

    • ๋น„ํŠธ์ฝ”์ธ(Bitcoin)
  • ๐Ÿ›๏ธ Humanities

    • Nordvik, Russia
    • North Sentinel Island
    • ๋กฑ๊ณ ๋กฑ๊ณ (Rongorongo)
  • ๐Ÿ‹๏ธ Wellness

    • ๐Ÿซ’ ์—‘์ŠคํŠธ๋ผ ๋ฒ„์ง„ ์˜ฌ๋ฆฌ๋ธŒ์œ  (Extra Virgin Olive Oil)
    • ์ฐจ์ „์žํ”ผ(Psyllium Husk)
  • ๐Ÿ–ฅ๏ธ Computer Graphics

    • 8 - Lighting
    • 9 - Orientation & Rotation
    • 10 - Character Animation
    • 11 - Curves
    • 12 - More Lighting, Texture
  • ๐Ÿ—‚๏ธ Operating System

    • 7. Deadlocks
    • 8. Memory Management(1)
    • 9. Memory Management(2)
    • 10. Virtual Memory(1)
    • 11. Virtual Memory(2)
    • 12. File System
    • 13. Mass Storage Management
    • 14. I/O Systems
  • ๐Ÿ”ฃ Programming Language Theory

    • 13. FPL(1)

11 - Curves

Outline

  • Intro: Motivation and Curve Representation
  • Polynomial Curve
    • Polynomial Interpolation
    • More Discussion on Polynomials
  • Hermite Curve
  • Bezier Curve
  • Brief Intro to Spline

Motivation: Why Do We Need Curve?

  • Smoothness
    • ์ด์Œ ์—†๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ์—ฐ๊ฒฐ
  • ๋งŽ์€ ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์‘์šฉ์—์„œ ๋ถ€๋“œ๋Ÿฌ์šด ํ˜•ํƒœ(smooth shape) ์™€ ๋ถ€๋“œ๋Ÿฌ์šด ์›€์ง์ž„(smooth movement) ์ด ํ•„์š”ํ•จ

Curve Representations

  • Explicit: y=f(x)y = f(x)y=f(x)

    • ์˜ˆ: y=x2+2xโˆ’2y = x^2 + 2x - 2y=x2+2xโˆ’2
    • ์žฅ์ : xxx๋งŒ ๋Œ€์ž…ํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ๊ณ„์‚ฐ ๋ฐ ์‹œ๊ฐํ™” ๊ฐ€๋Šฅ
    • ๋‹จ์ : ํ•˜๋‚˜์˜ xxx์— ์—ฌ๋Ÿฌ yyy๊ฐ€ ๋Œ€์‘๋˜๋Š” ๊ฒฝ์šฐ ํ‘œํ˜„ ๋ถˆ๊ฐ€ (์›, ์ˆ˜์ง์„  ๋“ฑ)
  • Implicit: f(x,y)=0f(x, y) = 0f(x,y)=0

    • ์˜ˆ: x2+y2โˆ’2=0x^2 + y^2 - 2 = 0x2+y2โˆ’2=0
    • ์žฅ์ : ์ ์ด ๋‚ด๋ถ€/์™ธ๋ถ€/๊ฒฝ๊ณ„์— ์žˆ๋Š”์ง€ ํŒ๋ณ„ ์‰ฌ์›€
    • ๋‹จ์ : ์ขŒํ‘œ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์‹œ๊ฐํ™”ํ•˜๊ธฐ์—” ๋น„ํšจ์œจ์ 
  • Parametric: (x,y)=(f(t),g(t))(x, y) = (f(t), g(t))(x,y)=(f(t),g(t))

    • ์˜ˆ: (x,y)=(2cosโก(t),2sinโก(t))(x, y) = (2 \cos(t), 2 \sin(t))(x,y)=(2cos(t),2sin(t))
  • ๊ฐ ์ ์€ ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜ ttt์˜ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„๋จ

    • ์žฅ์ : ttt์— ๊ฐ’๋งŒ ๋„ฃ์œผ๋ฉด ๊ณ„์‚ฐ/์‹œ๊ฐํ™” ์šฉ์ด
    • ttt๋Š” ๊ณก์„ ์ƒ์˜ ์ ์„ ๊ฒฐ์ •ํ•˜๋Š” "์ง€์—ญ ์ขŒํ‘œ๊ณ„" ์—ญํ• ์„ ํ•จ
  • Computer Graphics์—์„œ๋Š” ์ด parametric ํ‘œํ˜„ ๋ฐฉ์‹์ด ๊ฐ€์žฅ ์ ํ•ฉ

Polynomial Curve

  • ๋‹คํ•ญ์‹(Polynomial) ์€ ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์—์„œ ๊ณก์„ ์„ ํ‘œํ˜„ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋จ

    • ๋‹จ์ˆœํ•จ
    • ํšจ์œจ์ 
    • ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์›€
  • ์ฐจ์ˆ˜๊ฐ€ nnn์ธ ๋‹คํ•ญ์‹:

    x(t)=antn+anโˆ’1tnโˆ’1+โ‹ฏ+a1t+a0x(t) = a_n t^n + a_{n-1} t^{n-1} + \cdots + a_1 t + a_0 x(t)=anโ€‹tn+anโˆ’1โ€‹tnโˆ’1+โ‹ฏ+a1โ€‹t+a0โ€‹

Polynomial Interpolation

  • ๋‹คํ•ญ์‹์„ ์‚ฌ์šฉํ•ด ๋ถ€๋“œ๋Ÿฌ์šด ๊ณก์„ ์„ ๋งŒ๋“œ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ polynomial interpolation
  • ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋“ค์„ ํ†ต๊ณผํ•˜๋Š”
    ํŠน์ •ํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ๊ณก์„ ์„ ๊ฒฐ์ •ํ•จ
  • 1์ฐจ ๋‹คํ•ญ์‹(linear polynomial) ์„ ์ด์šฉํ•œ ์„ ํ˜• ๋ณด๊ฐ„ ์˜ˆ์‹œ
  • ์ž…๋ ฅ: ๋‘ ์  (t0,x0),(t1,x1)(t_0, x_0), (t_1, x_1)(t0โ€‹,x0โ€‹),(t1โ€‹,x1โ€‹)
  • ์ถœ๋ ฅ: 1์ฐจ ๋‹คํ•ญ์‹

    x(t)=a1t+a0x(t) = a_1 t + a_0 x(t)=a1โ€‹t+a0โ€‹

  • ๋‘ ์‹์„ ์„ธ์›Œ ๊ณ„์ˆ˜ a0a_0a0โ€‹, a1a_1a1โ€‹์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ:

    {a1t0+a0=x0a1t1+a0=x1\begin{cases} a_1 t_0 + a_0 = x_0 \\ a_1 t_1 + a_0 = x_1 \end{cases} {a1โ€‹t0โ€‹+a0โ€‹=x0โ€‹a1โ€‹t1โ€‹+a0โ€‹=x1โ€‹โ€‹

  • ํ–‰๋ ฌ ํ˜•ํƒœ๋กœ ์ •๋ฆฌ ๊ฐ€๋Šฅ:

    [1t01t1][a0a1]=[x0x1]\begin{bmatrix} 1 & t_0 \\ 1 & t_1 \end{bmatrix} \begin{bmatrix} a_0 \\ a_1 \end{bmatrix} = \begin{bmatrix} x_0 \\ x_1 \end{bmatrix} [11โ€‹t0โ€‹t1โ€‹โ€‹][a0โ€‹a1โ€‹โ€‹]=[x0โ€‹x1โ€‹โ€‹]

  • t0=0t_0 = 0t0โ€‹=0, t1=1t_1 = 1t1โ€‹=1๋กœ ์„ค์ •ํ•˜๋ฉด,

    x(t)=(1โˆ’t)x0+tx1x(t) = (1 - t)x_0 + tx_1 x(t)=(1โˆ’t)x0โ€‹+tx1โ€‹

  • 2์ฐจ ๋‹คํ•ญ์‹(quadratic) ์„ ์ด์šฉํ•œ ๋ณด๊ฐ„
  • ์ž…๋ ฅ: ์„ธ ์  (t0,x0),(t1,x1),(t2,x2)(t_0, x_0), (t_1, x_1), (t_2, x_2)(t0โ€‹,x0โ€‹),(t1โ€‹,x1โ€‹),(t2โ€‹,x2โ€‹)
  • 2์ฐจ ๋‹คํ•ญ์‹:

    x(t)=a2t2+a1t+a0x(t) = a_2 t^2 + a_1 t + a_0 x(t)=a2โ€‹t2+a1โ€‹t+a0โ€‹

  • 3๊ฐœ์˜ ๋ฏธ์ง€์ˆ˜ a0a_0a0โ€‹, a1a_1a1โ€‹, a2a_2a2โ€‹๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด
    3๊ฐœ์˜ ์กฐ๊ฑด์ด ํ•„์š”ํ•จ โ†’ 3๊ฐœ์˜ ์ ์ด ํ•„์š”
  • ํ–‰๋ ฌ ํ˜•ํƒœ:

    [1t0t021t1t121t2t22][a0a1a2]=[x0x1x2]\begin{bmatrix} 1 & t_0 & t_0^2 \\ 1 & t_1 & t_1^2 \\ 1 & t_2 & t_2^2 \end{bmatrix} \begin{bmatrix} a_0 \\ a_1 \\ a_2 \end{bmatrix} = \begin{bmatrix} x_0 \\ x_1 \\ x_2 \end{bmatrix} โ€‹111โ€‹t0โ€‹t1โ€‹t2โ€‹โ€‹t02โ€‹t12โ€‹t22โ€‹โ€‹โ€‹โ€‹a0โ€‹a1โ€‹a2โ€‹โ€‹โ€‹=โ€‹x0โ€‹x1โ€‹x2โ€‹โ€‹โ€‹

  • ์ฐจ์ˆ˜ nnn์˜ ๋‹คํ•ญ์‹์„ ์ด์šฉํ•œ ๋ณด๊ฐ„
  • ์ž…๋ ฅ: n+1n+1n+1๊ฐœ์˜ ์  (t0,x0),โ€ฆ,(tn,xn)(t_0, x_0), \ldots, (t_n, x_n)(t0โ€‹,x0โ€‹),โ€ฆ,(tnโ€‹,xnโ€‹)
  • ๋‹คํ•ญ์‹:

    x(t)=antn+โ‹ฏ+a1t+a0x(t) = a_n t^n + \cdots + a_1 t + a_0 x(t)=anโ€‹tn+โ‹ฏ+a1โ€‹t+a0โ€‹

  • ๊ณ„์ˆ˜ a0,โ€ฆ,ana_0, \ldots, a_na0โ€‹,โ€ฆ,anโ€‹ ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•:
    • Gauss ์†Œ๊ฑฐ๋ฒ• (Elimination)
    • Gauss-Jordan ์†Œ๊ฑฐ๋ฒ•
    • ํ–‰๋ ฌ ์—ญํ–‰๋ ฌ ๋“ฑ

Problem of Higher-Degree Polynomial Interpolation

  • ๋๋‹จ์—์„œ์˜ ์ง„๋™ ํ˜„์ƒ ๋ฐœ์ƒ โ†’ Runge's ํ˜„์ƒ(Rungeโ€™s Phenomenon)
  • ๋„ˆ๋ฌด ๋†’์€ ์ฐจ์ˆ˜์˜ ๋‹คํ•ญ์‹ ๋ณด๊ฐ„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์ง€ ์•Š์Œ

[Demo] Polynomial Interpolation

https://www.benjoffe.com/code/demos/interpolate

  • ๊ณก์„  ์œ„์˜ ์ ๋“ค์„ ๋“œ๋ž˜๊ทธํ•˜๋ฉฐ ๋ณ€ํ™” ๊ด€์ฐฐ
  • ์ฐจ์ˆ˜๋ฅผ ๋†’์ด๋ฉด ์ง„๋™์ด ๋” ์ปค์ง โ†’ Rungeโ€™s ํ˜„์ƒ ํ™•์ธ ๊ฐ€๋Šฅ

Cubic Polynomials

  • 3์ฐจ ๋‹คํ•ญ์‹(cubic) ์€ ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋จ

  • ์ด์œ :

    • 3์ฐจ๋Š” 3D ๊ณก์„ ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ์ฐจ์ˆ˜์˜ ๋‹คํ•ญ์‹
    • ๊ณ ์ฐจ ๋‹คํ•ญ์‹์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ง„๋™(Rungeโ€™s Phenomenon)์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Œ
  • ์ผ๋ฐ˜ ํ˜•ํƒœ:

    x(t)=a1t3+b1t2+c1t+d1y(t)=a2t3+b2t2+c2t+d2z(t)=a3t3+b3t2+c3t+d3x(t) = a_1 t^3 + b_1 t^2 + c_1 t + d_1 \\ y(t) = a_2 t^3 + b_2 t^2 + c_2 t + d_2 \\ z(t) = a_3 t^3 + b_3 t^2 + c_3 t + d_3 x(t)=a1โ€‹t3+b1โ€‹t2+c1โ€‹t+d1โ€‹y(t)=a2โ€‹t3+b2โ€‹t2+c2โ€‹t+d2โ€‹z(t)=a3โ€‹t3+b3โ€‹t2+c3โ€‹t+d3โ€‹

    ๋˜๋Š”

    p(t)=at3+bt2+ct+dp(t) = a t^3 + b t^2 + c t + d p(t)=at3+bt2+ct+d

Complex Curve from Cubic Polynomials?

  • ๊ณก์„ ์ด ๋ณต์žกํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ?
  • ํ•˜๋‚˜์˜ 3์ฐจ ๋‹คํ•ญ์‹๋งŒ์œผ๋กœ๋Š” ํ‘œํ˜„์ด ์–ด๋ ค์›€
    โ†’ ํ•ด๊ฒฐ์ฑ…: Spline (๊ตฌ๊ฐ„๋ณ„ ๋‹คํ•ญ์‹, piecewise polynomial)
  • ์ง€๊ธˆ์€ ๋จผ์ € ํ•˜๋‚˜์˜ ๊ตฌ๊ฐ„(segment)์— ์ง‘์ค‘ํ•ด์„œ ์‚ดํŽด๋ด„

Defining a Single Piece of Cubic Polynomial

  • ๋‹คํ•ญ์‹ ํ˜•ํƒœ:

    p(t)=at3+bt2+ct+dp(t) = a t^3 + b t^2 + c t + d p(t)=at3+bt2+ct+d

  • ๋ชฉํ‘œ: ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŠน์ •ํ•œ ๋‹คํ•ญ์‹ ๊ตฌํ•˜๊ธฐ

    • ์ฆ‰, aaa, bbb, ccc, ddd๋ฅผ ๊ฒฐ์ •
  • ์ด 4๊ฐœ์˜ ๋ฏธ์ง€์ˆ˜ โ†’ 4๊ฐœ์˜ ์กฐ๊ฑด ๋˜๋Š” ์ ์ด ํ•„์š”ํ•จ

  • ์˜ˆ์‹œ ์กฐ๊ฑด:

    • ์–‘ ๋ ์ ์˜ ์œ„์น˜
    • ์–‘ ๋ ์ ์—์„œ์˜ ๊ธฐ์šธ๊ธฐ (๋„ํ•จ์ˆ˜)

Formulation of a Single Piece of Polynomial

  • ๋‹คํ•ญ์‹์„ ํ‘œํ˜„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹:
  1. ๊ณ„์ˆ˜์™€ ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜:

    p(t)=at3+bt2+ct+dp(t) = a t^3 + b t^2 + c t + d p(t)=at3+bt2+ct+d

    • ๊ณ„์ˆ˜: a,b,c,da, b, c, da,b,c,d
    • ๋ณ€์ˆ˜: ttt
  2. ๊ธฐ์ € ํ•จ์ˆ˜์™€ ์  ๊ธฐ๋ฐ˜:

    p(t)=b0(t)p0+b1(t)p1+b2(t)p2+b3(t)p3p(t) = b_0(t) p_0 + b_1(t) p_1 + b_2(t) p_2 + b_3(t) p_3 p(t)=b0โ€‹(t)p0โ€‹+b1โ€‹(t)p1โ€‹+b2โ€‹(t)p2โ€‹+b3โ€‹(t)p3โ€‹

    • ๊ธฐ์ € ํ•จ์ˆ˜: b0(t),b1(t),b2(t),b3(t)b_0(t), b_1(t), b_2(t), b_3(t)b0โ€‹(t),b1โ€‹(t),b2โ€‹(t),b3โ€‹(t)
    • ์ œ์–ด์ : p0,p1,p2,p3p_0, p_1, p_2, p_3p0โ€‹,p1โ€‹,p2โ€‹,p3โ€‹
    • ๊ฐ ์ ์ด ๊ณก์„ ์— ๋ผ์น˜๋Š” ์˜ํ–ฅ์€ ๋Œ€์‘ํ•˜๋Š” basis ํ•จ์ˆ˜๊ฐ€ ์กฐ์ ˆํ•จ

Trivial Example: Linear Polynomial

  • ๋‘ ์  (t0,(x0,y0))(t_0, (x_0, y_0))(t0โ€‹,(x0โ€‹,y0โ€‹)), (t1,(x1,y1))(t_1, (x_1, y_1))(t1โ€‹,(x1โ€‹,y1โ€‹))๋ฅผ ์ง€๋‚˜๋Š” ์ง์„ 

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด 1์ฐจ ๋‹คํ•ญ์‹์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ:

    x(t)=a1xt+a0xy(t)=a1yt+a0yx(t) = a_{1x} t + a_{0x} \\ y(t) = a_{1y} t + a_{0y} x(t)=a1xโ€‹t+a0xโ€‹y(t)=a1yโ€‹t+a0yโ€‹

  • ๊ณ„์ˆ˜์™€ ๋ณ€์ˆ˜ ๊ธฐ์ค€ ํ‘œํ˜„:

    x(t)=(x1โˆ’x0)t+x0y(t)=(y1โˆ’y0)t+y0x(t) = (x_1 - x_0)t + x_0 \\ y(t) = (y_1 - y_0)t + y_0 x(t)=(x1โ€‹โˆ’x0โ€‹)t+x0โ€‹y(t)=(y1โ€‹โˆ’y0โ€‹)t+y0โ€‹

  • ๋ฒกํ„ฐ ํ‘œํ˜„:

    p(t)=(1โˆ’t)p0+tp1=(p1โˆ’p0)t+p0\begin{align*} \mathbf{p}(t) &= (1 - t)\mathbf{p}_0 + t\mathbf{p}_1 \\ &= (\mathbf{p}_1 - \mathbf{p}_0)t + \mathbf{p}_0 \end{align*} p(t)โ€‹=(1โˆ’t)p0โ€‹+tp1โ€‹=(p1โ€‹โˆ’p0โ€‹)t+p0โ€‹โ€‹

  • ํ–‰๋ ฌ ํ˜•ํƒœ ํ‘œํ˜„:

    p(t)=[t1][โˆ’1110][p0p1]\mathbf{p}(t) = \begin{bmatrix} t & 1 \end{bmatrix} \begin{bmatrix} -1 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} \mathbf{p}_0 \\ \mathbf{p}_1 \end{bmatrix} p(t)=[tโ€‹1โ€‹][โˆ’11โ€‹10โ€‹][p0โ€‹p1โ€‹โ€‹]

    • ์ฒซ ๋ฒˆ์งธ ๋ฒกํ„ฐ: power basis vector
    • ๋‘ ๋ฒˆ์งธ ํ–‰๋ ฌ: basis matrix
    • ์„ธ ๋ฒˆ์งธ ๋ฒกํ„ฐ: geometry vector
  • basis function๊ณผ ์ œ์–ด์  ๊ธฐ๋ฐ˜ ํ‘œํ˜„:

    p(t)=(p1โˆ’p0)t+p0=(1โˆ’t)p0+tp1\begin{align*} \mathbf{p}(t) &= (\mathbf{p}_1 - \mathbf{p}_0)t + \mathbf{p}_0 \\ &= (1 - t)\mathbf{p}_0 + t\mathbf{p}_1 \end{align*} p(t)โ€‹=(p1โ€‹โˆ’p0โ€‹)t+p0โ€‹=(1โˆ’t)p0โ€‹+tp1โ€‹โ€‹

  • ํ–‰๋ ฌ ๊ด€์ ์œผ๋กœ๋„ ํ•ด์„ ๊ฐ€๋Šฅ:

    p(t)=([t1][โˆ’1110])[p0p1]\mathbf{p}(t) = \left( \begin{bmatrix} t & 1 \end{bmatrix} \begin{bmatrix} -1 & 1 \\ 1 & 0 \end{bmatrix} \right) \begin{bmatrix} \mathbf{p}_0 \\ \mathbf{p}_1 \end{bmatrix} p(t)=([tโ€‹1โ€‹][โˆ’11โ€‹10โ€‹])[p0โ€‹p1โ€‹โ€‹]

  • ์ด๋•Œ (1โˆ’t)(1 - t)(1โˆ’t), ttt๋Š” basis function ์—ญํ• 

Meaning of Basis Functions

  • ์„ ํ˜• ๋ณด๊ฐ„์˜ basis ํ•จ์ˆ˜ ํ•ด์„:

    p(t)=(1โˆ’t)p0+tp1\mathbf{p}(t) = (1 - t)\mathbf{p}_0 + t\mathbf{p}_1 p(t)=(1โˆ’t)p0โ€‹+tp1โ€‹

  • ttt๊ฐ€ ๋ฐ”๋€” ๋•Œ ๊ฐ ์ ์˜ ๊ธฐ์—ฌ๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™”:

    • b0(t)=1โˆ’tb_0(t) = 1 - tb0โ€‹(t)=1โˆ’t
    • b1(t)=tb_1(t) = tb1โ€‹(t)=t

Hermite Curve์˜ ๊ฐœ๋… ๋ฐ ๋™๊ธฐ

  • Hermite curve๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 3์ฐจ ๋‹คํ•ญ์‹(cubic polynomia)์œผ๋กœ ํ‘œํ˜„๋˜๋ฉฐ,
    Hermite ํ˜•์‹์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
  • Spline ์„ค๊ณ„์—์„œ๋Š” ๊ณก์„  ์กฐ๊ฐ๋“ค ์‚ฌ์ด์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์—ฐ๊ฒฐ(smooth connection) ์ด ์ค‘์š”
    โ†’ Hermite ๊ณก์„ ์€ ๋‹ค์Œ์„ ๋ช…์‹œํ•จ์œผ๋กœ์จ ์ด๋ฅผ ํ•ด๊ฒฐ:
    • ์–‘ ๋์ ์˜ ์œ„์น˜
    • ์–‘ ๋์ ์—์„œ์˜ 1์ฐจ ๋„ํ•จ์ˆ˜ (๊ธฐ์šธ๊ธฐ, tangent)
  • ์ œ์•ฝ ์กฐ๊ฑด:
    ๋์  p0p_0p0โ€‹, p1p_1p1โ€‹๊ณผ ํ•ด๋‹น ์ ‘์„  ๋ฒกํ„ฐ(๊ธฐ์šธ๊ธฐ) v0v_0v0โ€‹, v1v_1v1โ€‹์ด ์ฃผ์–ด์ง

Hermite Curve ์ˆ˜์‹ ์œ ๋„

  • 3์ฐจ ๋‹คํ•ญ์‹์˜ ์ผ๋ฐ˜ ํ˜•ํƒœ:

    x(t)=at3+bt2+ct+dxโ€ฒ(t)=3at2+2bt+cx(t) = a t^3 + b t^2 + c t + d \\ x'(t) = 3a t^2 + 2b t + c x(t)=at3+bt2+ct+dxโ€ฒ(t)=3at2+2bt+c

  • ์ œ์•ฝ ์กฐ๊ฑด:

    x(0)=x0=dx(1)=x1=a+b+c+dxโ€ฒ(0)=x0โ€ฒ=cxโ€ฒ(1)=x1โ€ฒ=3a+2b+cx(0) = x_0 = d \\ x(1) = x_1 = a + b + c + d \\ x'(0) = x_0' = c \\ x'(1) = x_1' = 3a + 2b + c x(0)=x0โ€‹=dx(1)=x1โ€‹=a+b+c+dxโ€ฒ(0)=x0โ€ฒโ€‹=cxโ€ฒ(1)=x1โ€ฒโ€‹=3a+2b+c

  • ๊ณ„์ˆ˜ ๋„์ถœ:

    d=x0c=x0โ€ฒa=2x0โˆ’2x1+x0โ€ฒ+x1โ€ฒb=โˆ’3x0+3x1โˆ’2x0โ€ฒโˆ’x1โ€ฒ\begin{aligned} d &= x_0 \\ c &= x_0' \\ a &= 2x_0 - 2x_1 + x_0' + x_1' \\ b &= -3x_0 + 3x_1 - 2x_0' - x_1' \end{aligned} dcabโ€‹=x0โ€‹=x0โ€ฒโ€‹=2x0โ€‹โˆ’2x1โ€‹+x0โ€ฒโ€‹+x1โ€ฒโ€‹=โˆ’3x0โ€‹+3x1โ€‹โˆ’2x0โ€ฒโ€‹โˆ’x1โ€ฒโ€‹โ€‹

  • ํ–‰๋ ฌ ํ˜•ํƒœ๋กœ ํ‘œํ˜„:

    [abcd]=[2โˆ’211โˆ’33โˆ’2โˆ’100101000][p0p1v0v1]\begin{bmatrix} a \\ b \\ c \\ d \end{bmatrix} = \begin{bmatrix} 2 & -2 & 1 & 1 \\ -3 & 3 & -2 & -1 \\ 0 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} p_0 \\ p_1 \\ v_0 \\ v_1 \end{bmatrix} โ€‹abcdโ€‹โ€‹=โ€‹2โˆ’301โ€‹โˆ’2300โ€‹1โˆ’210โ€‹1โˆ’100โ€‹โ€‹โ€‹p0โ€‹p1โ€‹v0โ€‹v1โ€‹โ€‹โ€‹

Hermite Curve ํ–‰๋ ฌ ํ‘œํ˜„

  • ํ–‰๋ ฌ ํ˜•ํƒœ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•จ:

    p(t)=[t3t2t1]โ‹…Hermiteย basisย matrixโ‹…[p0p1v0v1]\mathbf{p}(t) = \begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix} \cdot \text{Hermite basis matrix} \cdot \begin{bmatrix} p_0 \\ p_1 \\ v_0 \\ v_1 \end{bmatrix} p(t)=[t3โ€‹t2โ€‹tโ€‹1โ€‹]โ‹…Hermiteย basisย matrixโ‹…โ€‹p0โ€‹p1โ€‹v0โ€‹v1โ€‹โ€‹โ€‹

  • ์ฆ‰,

    p(t)=b0(t)p0+b1(t)p1+b2(t)v0+b3(t)v1\mathbf{p}(t) = b_0(t)p_0 + b_1(t)p_1 + b_2(t)v_0 + b_3(t)v_1 p(t)=b0โ€‹(t)p0โ€‹+b1โ€‹(t)p1โ€‹+b2โ€‹(t)v0โ€‹+b3โ€‹(t)v1โ€‹

  • ์—ฌ๊ธฐ์„œ basis ํ•จ์ˆ˜ bi(t)b_i(t)biโ€‹(t)๋Š” ๊ณก์„ ์—์„œ ๊ฐ ์ ์˜ ์˜ํ–ฅ๋„๋ฅผ ์กฐ์ ˆํ•จ

Hermite Curve - Basis Functions ๊ด€์ 

  • ๋‹คํ•ญ์‹ ํ‘œํ˜„:

    p(t)=at3+bt2+ct+dp(t) = a t^3 + b t^2 + c t + d p(t)=at3+bt2+ct+d

  • ์ด๋ฅผ basis function๊ณผ ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด:

    p(t)=b0(t)p0+b1(t)p1+b2(t)p2+b3(t)p3p(t) = b_0(t)p_0 + b_1(t)p_1 + b_2(t)p_2 + b_3(t)p_3 p(t)=b0โ€‹(t)p0โ€‹+b1โ€‹(t)p1โ€‹+b2โ€‹(t)p2โ€‹+b3โ€‹(t)p3โ€‹

  • ํ–‰๋ ฌ ๊ด€์ :
    • ํ–‰: ๊ณ„์ˆ˜
    • ์—ด: basis function (์ฆ‰, t3t^3t3, t2t^2t2, ttt, 111)

Hermite Curve - Basis Function ์‹œ๊ฐํ™”

  • Hermite basis function ๋“ค์€ ์‹œ๊ฐ„ ttt์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ
    ๊ฐ ์ œ์–ด์  ๋ฐ ์ ‘์„ ์ด ๊ณก์„ ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๋„๋ฅผ ์กฐ์ ˆ
  • ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด basis ํ•จ์ˆ˜ h0(t)h_0(t)h0โ€‹(t), h1(t)h_1(t)h1โ€‹(t), h2(t)h_2(t)h2โ€‹(t), h3(t)h_3(t)h3โ€‹(t)์˜ ๋ณ€ํ™”๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅ

[Demo] Hermite Curve

https://codepen.io/iIorda/pen/KrvBwr

  • ๋์ ๊ณผ ์ ‘์„ (๋„ํ•จ์ˆ˜)์˜ ์œ„์น˜๋ฅผ ๋“œ๋ž˜๊ทธํ•˜์—ฌ
    ๊ณก์„ ์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธ

Bezier Curve

  • Bezier ๊ณก์„ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ Bezier ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋˜๋Š” ๋‹คํ•ญ ๊ณก์„ (polynomial curve)
  • Motivation:
    • Spline์—์„œ๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ๊ณก์„  ์—ฐ๊ฒฐ์ด ์ค‘์š”
    • Bezier์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด ์ œ์–ด์ (control points) ์„ ์ ์ ˆํžˆ ๋ฐฐ์น˜ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐ

Recall: Hermite curve

  • ์ œ์•ฝ ์กฐ๊ฑด: ๋์ ๊ณผ ์ ‘์„ (๋„ํ•จ์ˆ˜)
  • Hermite ๊ณก์„ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋จ:

    p(t)=[t3t2t1]โ‹…[2โˆ’211โˆ’33โˆ’2โˆ’100101000]โ‹…[p0p1v0v1]\mathbf{p}(t) = \begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix} \cdot \begin{bmatrix} 2 & -2 & 1 & 1 \\ -3 & 3 & -2 & -1 \\ 0 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \end{bmatrix} \cdot \begin{bmatrix} \mathbf{p}_0 \\ \mathbf{p}_1 \\ \mathbf{v}_0 \\ \mathbf{v}_1 \end{bmatrix} p(t)=[t3โ€‹t2โ€‹tโ€‹1โ€‹]โ‹…โ€‹2โˆ’301โ€‹โˆ’2300โ€‹1โˆ’210โ€‹1โˆ’100โ€‹โ€‹โ‹…โ€‹p0โ€‹p1โ€‹v0โ€‹v1โ€‹โ€‹โ€‹

Hermite to Bรฉzier

  • ์ ๊ณผ ๋ฒกํ„ฐ๋ฅผ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์ง๊ด€์ ์ด์ง€ ์•Š์Œ

  • ๋”ฐ๋ผ์„œ ๋ฒกํ„ฐ๋ฅผ ์ ์˜ ์ฐจ์ด๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ๋ช…ํ™•

  • ์˜ˆ:

    • t0=p1โˆ’p0t_0 = \mathbf{p}_1 - \mathbf{p}_0t0โ€‹=p1โ€‹โˆ’p0โ€‹
    • t1=p1โˆ’p0t_1 = \mathbf{p}_1 - \mathbf{p}_0t1โ€‹=p1โ€‹โˆ’p0โ€‹ ๋˜๋Š” โˆ’t1-t_1โˆ’t1โ€‹ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ
  • Bezier ์ œ์–ด์  ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋Œ€์‘:

    • Hermite ๊ณก์„ ์˜ ์ž…๋ ฅ:
      • p0\mathbf{p}_0p0โ€‹, p1\mathbf{p}_1p1โ€‹ : ์‹œ์ž‘/์ข…๋ฃŒ ์ง€์ 
      • v0\mathbf{v}_0v0โ€‹, v1\mathbf{v}_1v1โ€‹ : ์‹œ์ž‘/์ข…๋ฃŒ ์ ‘์„  ๋ฒกํ„ฐ
    • Bezier ๊ณก์„ ์˜ ์ œ์–ด์ :
      • q0=p0\mathbf{q}_0 = \mathbf{p}_0q0โ€‹=p0โ€‹
      • q3=p1\mathbf{q}_3 = \mathbf{p}_1q3โ€‹=p1โ€‹
      • q1=p0+13v0\mathbf{q}_1 = \mathbf{p}_0 + \frac{1}{3} \mathbf{v}_0q1โ€‹=p0โ€‹+31โ€‹v0โ€‹
      • q2=p1โˆ’13v1\mathbf{q}_2 = \mathbf{p}_1 - \frac{1}{3} \mathbf{v}_1q2โ€‹=p1โ€‹โˆ’31โ€‹v1โ€‹
  • ๋˜๋Š” ์—ญ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด:

    p0=q0p1=q3v0=3(q1โˆ’q0)v1=3(q3โˆ’q2)\begin{aligned} \mathbf{p}_0 &= \mathbf{q}_0 \\ \mathbf{p}_1 &= \mathbf{q}_3 \\ \mathbf{v}_0 &= 3 (\mathbf{q}_1 - \mathbf{q}_0) \\ \mathbf{v}_1 &= 3 (\mathbf{q}_3 - \mathbf{q}_2) \end{aligned} p0โ€‹p1โ€‹v0โ€‹v1โ€‹โ€‹=q0โ€‹=q3โ€‹=3(q1โ€‹โˆ’q0โ€‹)=3(q3โ€‹โˆ’q2โ€‹)โ€‹

  • ์—ฌ๊ธฐ์„œ ๋ฏธ๋ถ„๊ฐ’์€ 3๋ฐฐ scale๋กœ ์ •์˜๋จ
    (Bรฉzier ๊ณก์„ ์˜ ๋ฏธ๋ถ„ ์‹œ offset์ด ํฌํ•จ๋˜๋ฏ€๋กœ ์กฐ์ • ํ•„์š”)

Hermite to Bรฉzier ๋ณ€ํ™˜ (์š”์•ฝ)

  • Hermite ํ˜•ํƒœ:

    [p0p1v0v1]=[1000000103โˆ’30003โˆ’3][q0q1q2q3]\begin{bmatrix} \mathbf{p}_0 \\ \mathbf{p}_1 \\ \mathbf{v}_0 \\ \mathbf{v}_1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 3 & -3 & 0 \\ 0 & 0 & 3 & -3 \end{bmatrix} \begin{bmatrix} \mathbf{q}_0 \\ \mathbf{q}_1 \\ \mathbf{q}_2 \\ \mathbf{q}_3 \end{bmatrix} โ€‹p0โ€‹p1โ€‹v0โ€‹v1โ€‹โ€‹โ€‹=โ€‹1000โ€‹0030โ€‹00โˆ’33โ€‹010โˆ’3โ€‹โ€‹โ€‹q0โ€‹q1โ€‹q2โ€‹q3โ€‹โ€‹โ€‹

  • Hermite basis matrix์— Bezier ๋ณ€ํ™˜์„ ๊ณฑํ•˜๋ฉด:

    [abcd]=[2โˆ’211โˆ’33โˆ’2โˆ’100101000]โ‹…[1000000103โˆ’30003โˆ’3]=Bezierย basisย matrix\begin{bmatrix} a \\ b \\ c \\ d \end{bmatrix} = \begin{bmatrix} 2 & -2 & 1 & 1 \\ -3 & 3 & -2 & -1 \\ 0 & 0 & 1 & 0 \\ 1 & 0 & 0 & 0 \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 3 & -3 & 0 \\ 0 & 0 & 3 & -3 \end{bmatrix} = \text{Bezier basis matrix} โ€‹abcdโ€‹โ€‹=โ€‹2โˆ’301โ€‹โˆ’2300โ€‹1โˆ’210โ€‹1โˆ’100โ€‹โ€‹โ‹…โ€‹1000โ€‹0030โ€‹00โˆ’33โ€‹010โˆ’3โ€‹โ€‹=Bezierย basisย matrix

Bรฉzier Matrix์™€ Bernstein Basis

  • Bรฉzier ํ–‰๋ ฌ ํ‘œํ˜„:

    p(t)=[t3t2t1]โ‹…[โˆ’13โˆ’313โˆ’630โˆ’33001000]โ‹…[P0P1P2P3]\mathbf{p}(t) = \begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix} \cdot \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \end{bmatrix} \cdot \begin{bmatrix} \mathbf{P}_0 \\ \mathbf{P}_1 \\ \mathbf{P}_2 \\ \mathbf{P}_3 \end{bmatrix} p(t)=[t3โ€‹t2โ€‹tโ€‹1โ€‹]โ‹…โ€‹โˆ’13โˆ’31โ€‹3โˆ’630โ€‹โˆ’3300โ€‹1000โ€‹โ€‹โ‹…โ€‹P0โ€‹P1โ€‹P2โ€‹P3โ€‹โ€‹โ€‹

  • ์œ„ ํ–‰๋ ฌ์€ Bernstein ๋‹คํ•ญ์‹์— ๊ธฐ๋ฐ˜ํ•จ:

    bn,k(t)=(nk)tk(1โˆ’t)nโˆ’kb_{n,k}(t) = \binom{n}{k} t^k (1 - t)^{n - k} bn,kโ€‹(t)=(knโ€‹)tk(1โˆ’t)nโˆ’k

  • ์ด ํ–‰๋ ฌ์€ Bรฉzier ๊ณก์„ ์„ ์–ด๋–ค ์ฐจ์ˆ˜์—์„œ๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

Bรฉzier Curve

  • Bernstein Basis Functions (n=3)(n = 3)(n=3):

    B03(t)=(1โˆ’t)3B13(t)=3t(1โˆ’t)2B23(t)=3t2(1โˆ’t)B33(t)=t3\begin{aligned} B_0^3(t) &= (1 - t)^3 \\ B_1^3(t) &= 3t(1 - t)^2 \\ B_2^3(t) &= 3t^2(1 - t) \\ B_3^3(t) &= t^3 \end{aligned} B03โ€‹(t)B13โ€‹(t)B23โ€‹(t)B33โ€‹(t)โ€‹=(1โˆ’t)3=3t(1โˆ’t)2=3t2(1โˆ’t)=t3โ€‹

  • Cubic Bรฉzier Curve ํ‘œํ˜„:

    p(t)=B03(t)p0+B13(t)p1+B23(t)p2+B33(t)p3\mathbf{p}(t) = B_0^3(t)\mathbf{p}_0 + B_1^3(t)\mathbf{p}_1 + B_2^3(t)\mathbf{p}_2 + B_3^3(t)\mathbf{p}_3 p(t)=B03โ€‹(t)p0โ€‹+B13โ€‹(t)p1โ€‹+B23โ€‹(t)p2โ€‹+B33โ€‹(t)p3โ€‹

  • ์ „๊ฐœ ํ˜•ํƒœ:

    p(t)=(1โˆ’t)3p0+3t(1โˆ’t)2p1+3t2(1โˆ’t)p2+t3p3\mathbf{p}(t) = (1 - t)^3 \mathbf{p}_0 + 3t(1 - t)^2 \mathbf{p}_1 + 3t^2(1 - t) \mathbf{p}_2 + t^3 \mathbf{p}_3 p(t)=(1โˆ’t)3p0โ€‹+3t(1โˆ’t)2p1โ€‹+3t2(1โˆ’t)p2โ€‹+t3p3โ€‹

Bรฉzier Basis ์‹œ๊ฐํ™”

  • ๋„ค ๊ฐœ์˜ Bernstein basis ํ•จ์ˆ˜๋“ค์ด t ๊ฐ’์— ๋”ฐ๋ผ
    ๊ณก์„ ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์คŒ
  • ์ œ์–ด์  p0\mathbf{p}_0p0โ€‹, p1\mathbf{p}_1p1โ€‹, p2\mathbf{p}_2p2โ€‹, p3\mathbf{p}_3p3โ€‹ ๊ฐ๊ฐ์€
    ํ•ด๋‹น basis ํ•จ์ˆ˜์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์Œ

de Casteljauโ€™s Algorithm

  • Bezier curve๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•
  • ํ”„๋ž‘์Šค์˜ Paul de Casteljau๊ฐ€ 1959๋…„์— ๊ฐœ๋ฐœ
    (๋‹น์‹œ Citroรซn ๊ทผ๋ฌด ์ค‘์ด๋ผ ํšŒ์‚ฌ ์ •์ฑ…์ƒ ๋…ผ๋ฌธ ๋ฐœํ‘œ๋Š” ๋ชปํ•จ)

Cubic Bezier Curve์˜ ์‹œ์ž‘

  • ๋„ค ๊ฐœ์˜ ์ œ์–ด์  p0\mathbf{p}_0p0โ€‹, p1\mathbf{p}_1p1โ€‹, p2\mathbf{p}_2p2โ€‹, p3\mathbf{p}_3p3โ€‹๋กœ ์‹œ์ž‘

1๋‹จ๊ณ„ ๋ณด๊ฐ„ (1st level interpolation)

  • ์ง์„  ์ƒ์˜ ๋ณด๊ฐ„:

    q0=Lerp(t,p0,p1)q1=Lerp(t,p1,p2)q2=Lerp(t,p2,p3)\begin{aligned} \mathbf{q}_0 &= \text{Lerp}(t, \mathbf{p}_0, \mathbf{p}_1) \\ \mathbf{q}_1 &= \text{Lerp}(t, \mathbf{p}_1, \mathbf{p}_2) \\ \mathbf{q}_2 &= \text{Lerp}(t, \mathbf{p}_2, \mathbf{p}_3) \end{aligned} q0โ€‹q1โ€‹q2โ€‹โ€‹=Lerp(t,p0โ€‹,p1โ€‹)=Lerp(t,p1โ€‹,p2โ€‹)=Lerp(t,p2โ€‹,p3โ€‹)โ€‹

2๋‹จ๊ณ„ ๋ณด๊ฐ„ (2nd level interpolation)

  • ๋‹ค์‹œ ์ง์„  ๋ณด๊ฐ„:

    r0=Lerp(t,q0,q1)r1=Lerp(t,q1,q2)\begin{aligned} \mathbf{r}_0 &= \text{Lerp}(t, \mathbf{q}_0, \mathbf{q}_1) \\ \mathbf{r}_1 &= \text{Lerp}(t, \mathbf{q}_1, \mathbf{q}_2) \end{aligned} r0โ€‹r1โ€‹โ€‹=Lerp(t,q0โ€‹,q1โ€‹)=Lerp(t,q1โ€‹,q2โ€‹)โ€‹

3๋‹จ๊ณ„ ๋ณด๊ฐ„ (์ตœ์ข… ์  ๊ณ„์‚ฐ)

  • ๋งˆ์ง€๋ง‰ ๋ณด๊ฐ„์œผ๋กœ ๊ณก์„  ์œ„์˜ ์  xxx ๊ณ„์‚ฐ:

    x=Lerp(t,r0,r1)\mathbf{x} = \text{Lerp}(t, \mathbf{r}_0, \mathbf{r}_1) x=Lerp(t,r0โ€‹,r1โ€‹)

์‹œ๊ฐ์  ๋ฐ˜๋ณต ์š”์•ฝ

  • ๋ฐ˜๋ณต์  ๋ณด๊ฐ„์„ ํ†ตํ•ด Bezier ๊ณก์„  ์œ„์˜ ์  x\mathbf{x}x๋ฅผ ๊ณ„์‚ฐ
  • ๋ชจ๋“  ๋ณด๊ฐ„์€ ๋‹จ์ˆœํ•œ ์„ ํ˜• ๋ณด๊ฐ„:

    Lerp(t,a,b)=(1โˆ’t)a+tb\text{Lerp}(t, \mathbf{a}, \mathbf{b}) = (1 - t)\mathbf{a} + t\mathbf{b} Lerp(t,a,b)=(1โˆ’t)a+tb

๋ณต์žกํ•œ ์˜ˆ์‹œ (๊ณ ์ฐจ Bezier curve)

  • Berkeley ์ž๋ฃŒ ๊ธฐ์ค€:
    ๋‹ค์ฐจ์› Bezier curve์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅ

  • ๋ฐ˜๋ณต์ ์ธ ๋ณด๊ฐ„์„ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ๊ฑฐ์น˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ์„ ์–ป์Œ:

    • T=(1โˆ’t)P+tQT = (1 - t)P + tQT=(1โˆ’t)P+tQ
    • P=(1โˆ’t)2A+2(1โˆ’t)tB+t2CP = (1 - t)^2A + 2(1 - t)tB + t^2CP=(1โˆ’t)2A+2(1โˆ’t)tB+t2C
    • A=(1โˆ’t)3K+3(1โˆ’t)2tL+3(1โˆ’t)t2M+t3NA = (1 - t)^3K + 3(1 - t)^2tL + 3(1 - t)t^2M + t^3NA=(1โˆ’t)3K+3(1โˆ’t)2tL+3(1โˆ’t)t2M+t3N
      ...
  • ์‹ค์ œ ์˜ˆ์ œ ๋งํฌ: https://people.eecs.berkeley.edu/~sequin/CS284/LECT6/03.htm

de Casteljauโ€™s Algorithm (์„ธ๊ทธ๋จผํŠธ ๋ถ„ํ• )

  • Bezier ๊ณก์„  ์œ„์˜ ํ•œ ์ ์„ ๊ณ„์‚ฐํ•˜๋Š” ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ถ”๊ฐ€์ ์œผ๋กœ, Bezier ๊ณก์„ ์„ ๋‘ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ œ์–ด์ ๋“ค์„ ๊ณ„์† ๋‚˜๋ˆ ๊ฐ€๋ฉฐ ๊ณก์„ ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
    โ†’ "Subdivision" ๋ฐฉ์‹์œผ๋กœ ๊ณก์„ ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Œ

[Demo] de Casteljauโ€™s Algorithm

http://www.naim.cs.e.ntu.edu.tw/DnCasteljauAndBezier.php

  • ๋นจ๊ฐ„ ์ (red points)์„ ์ด๋™์‹œ์ผœ ๋ณด์„ธ์š”
  • subdivision ๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ํ™•์ธ ๊ฐ€๋Šฅ

Displaying Curves

  • ๊ณก์„ ์„ ์‹œ๊ฐํ™”ํ•˜๋ ค๋ฉด p(t)p(t)p(t) ์œ„์˜ ์—ฌ๋Ÿฌ ์ ์„ ๊ณ„์‚ฐํ•˜๊ณ 
    ๊ทธ ์ ๋“ค์„ ์„ ๋ถ„์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๋จ
  • ๋ฐฉ๋ฒ•๋“ค:
    • Brute-force: ์ผ์ • ๊ฐ„๊ฒฉ์œผ๋กœ ttt ๊ฐ’์„ ๋ฐ”๊พธ๋ฉฐ p(t)p(t)p(t) ์ง์ ‘ ๊ณ„์‚ฐ
    • Finite difference: ๊ฐ™์€ ์›๋ฆฌ์ง€๋งŒ ๋” ํšจ์œจ์ 
      http://www.drdobbs.com/forward-difference-calculation-of-bezier/184403417
    • Subdivision: de Casteljau ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™œ์šฉ

Properties of Bezier Curve

  • ์ œ์–ด์ (control points) ์„ ํ†ตํ•ด ์ง๊ด€์ ์œผ๋กœ ์ œ์–ด ๊ฐ€๋Šฅ
  • ๊ณก์„ ์€ ํ•ญ์ƒ ์ œ์–ด์ ๋“ค์˜ convex hull ์•ˆ์— ์กด์žฌ
    • convex hull: ์ œ์–ด์ ๋“ค์„ ํฌํ•จํ•˜๋Š” ์ตœ์†Œ ๋ณผ๋ก ๋‹ค๊ฐํ˜•
  • ๋์  ๋ณด๊ฐ„(end point interpolation):
    Bezier ๊ณก์„ ์€ p0\mathbf{p}_0p0โ€‹๊ณผ pn\mathbf{p}_npnโ€‹์„ ์ •ํ™•ํžˆ ํ†ต๊ณผ

Spline

  • Spline: ์กฐ๊ฐ๋ณ„ ๋‹คํ•ญ์‹ (piecewise polynomial)
  • ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์ด์Šˆ:
    • ์ด ์กฐ๊ฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ์—ฐ์†์ ์œผ๋กœ ์—ฐ๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€?
    • spline์˜ ํ˜•ํƒœ๋ฅผ ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
    • spline์ด ํŠน์ •ํ•œ ์ ๋“ค์„ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

Continuity

https://math.hws.edu/graphicshook/demo/c2/cubic-bezier.html

  • Bezier spline ๋ฐ๋ชจ์—์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”
  • spline์„ ์–ด๋–ป๊ฒŒ "๋ถ€๋“œ๋Ÿฝ๊ฒŒ(smooth)" ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ?
  • ๋ถ€๋“œ๋Ÿฌ์›€(Smoothness)์€ ์—ฐ์†์„ฑ์˜ ์ฐจ์ˆ˜(order) ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Œ
    • 0์ฐจ ์—ฐ์†์„ฑ C0C^0C0:
      ์–‘์ชฝ์—์„œ ์œ„์น˜(position) ๋งŒ ์ผ์น˜
    • 1์ฐจ ์—ฐ์†์„ฑ C1C^1C1:
      ์œ„์น˜์™€ 1์ฐจ ๋ฏธ๋ถ„(์†๋„, velocity) ์ผ์น˜
    • 2์ฐจ ์—ฐ์†์„ฑ C2C^2C2:
      ์œ„์น˜, 1์ฐจ, 2์ฐจ ๋ฏธ๋ถ„(๊ฐ€์†๋„, acceleration) ๊นŒ์ง€ ์ผ์น˜
  • ์•„๋ž˜ ๊ทธ๋ฆผ์€ ์ฐจ์ˆ˜์— ๋”ฐ๋ฅธ ์—ฐ์†์„ฑ์˜ ์ฐจ์ด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์คŒ

Control

https://math.hws.edu/graphicshook/demo/c2/cubic-bezier.html
https://www.benoffe.com/code/demos/interpolate

  • ํŠน์ •ํ•œ ํ˜•ํƒœ์˜ ๊ณก์„ ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ,
    ์–ด๋–ค ๊ณก์„ ์ด ๋” ์ œ์–ดํ•˜๊ธฐ ์‰ฌ์šด๊ฐ€?
  • ์ขŒ: Bezier spline
  • ์šฐ: Polynomial interpolation
  • ๋กœ์ปฌ ์ œ์–ด(local control):
    • ์ œ์–ด์ ์„ ํ•˜๋‚˜ ๋ฐ”๊ฟจ์„ ๋•Œ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋จ
  • ๋กœ์ปฌ ์ œ์–ด๊ฐ€ ์—†์œผ๋ฉด spline ์‚ฌ์šฉ์ด ๋งค์šฐ ์–ด๋ ค์›€
    (๋ชจ๋“  ๊ตฌ๊ฐ„์ด ์˜ํ–ฅ์„ ๋ฐ›์Œ)
  • ๋‹ค์Œ์€ ๋กœ์ปฌ ์ œ์–ด๊ฐ€ ์—†๋Š” ์˜ˆ์‹œ:
    • ์ž์—ฐ ์Šคํ”Œ๋ผ์ธ (natural spline)
    • ์ „์ฒด ๋‹คํ•ญ์‹ ํ”ผํŒ…(polynomial fits)

Interpolation / Approximation

  • Interpolation (๋ณด๊ฐ„):
    • ๊ณก์„ ์ด ์ ๋“ค์„ ์ •ํ™•ํžˆ ํ†ต๊ณผ
  • Approximation (๊ทผ์‚ฌ):
    • ๊ณก์„ ์ด ์ ๋“ค์„ ๋”ฐ๋ผ๊ฐ€์ง€๋งŒ ํ†ต๊ณผํ•˜์ง€๋Š” ์•Š์Œ
  • ๋ณด๊ฐ„์ด ๋” ์„ ํ˜ธ๋˜์ง€๋งŒ, ํ•ญ์ƒ ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Œ

Bezier Spline

  • ์—ฐ์†์„ฑ: C0C^0C0 ๋˜๋Š” C1C^1C1 ๊ฐ€๋Šฅ
  • ๋กœ์ปฌ ์ œ์–ด(Local controllability)
  • ๋ณด๊ฐ„(interpolation): ๋‹จ์ง€ ์–‘ ๋ ๋‘ ์ ๋งŒ ํ†ต๊ณผ
  • Bezier spline์€ ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋จ:
    • Adobe Illustrator ๊ฐ™์€ ๊ทธ๋ž˜ํ”ฝ ๋„๊ตฌ์—์„œ ํ˜•ํƒœ(shape) ์ƒ์„ฑ
    • Blender, Maya ๋“ฑ 3D ํˆด์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฒฝ๋กœ ์ •์˜
    • TrueType ํฐํŠธ๋Š” quadratic Bezier spline ์‚ฌ์šฉ
      PostScript ํฐํŠธ๋Š” cubic Bezier spline ์‚ฌ์šฉ

Catmull-Rom Spline

  • ์—ฐ์†๋œ ๋‘ ์ œ์–ด์  ์‚ฌ์ด์— ํ•˜๋‚˜์˜ Hermite ๊ณก์„ ์„ ์ •์˜

  • ๋์ ์—์„œ์˜ ๋„ํ•จ์ˆ˜(๊ธฐ์šธ๊ธฐ)๋Š” ์ธ์ ‘ ์ œ์–ด์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐํ•จ:

    pโ€ฒ(tj)=Pj+1โˆ’Pjโˆ’12\mathbf{p}'(t_j) = \frac{\mathbf{P}_{j+1} - \mathbf{P}_{j-1}}{2} pโ€ฒ(tjโ€‹)=2Pj+1โ€‹โˆ’Pjโˆ’1โ€‹โ€‹

  • C1C^1C1 ์—ฐ์†์„ฑ, ๋กœ์ปฌ ์ œ์–ด ๊ฐ€๋Šฅ, ๋ณด๊ฐ„(interpolation) ๊ฐ€๋Šฅ

Natural Cubic Splines

  • ๋ชฉํ‘œ: ๋” ๋†’์€ ์—ฐ์†์„ฑ, ์ตœ์†Œ C2C^2C2 ์—ฐ์†์„ฑ
  • 4n4n4n๊ฐœ์˜ ๋ฏธ์ง€์ˆ˜ (n๊ฐœ์˜ 3์ฐจ ๋‹คํ•ญ ๊ตฌ๊ฐ„ ๊ฐ๊ฐ์˜ ๊ณ„์ˆ˜)
  • 4n4n4n๊ฐœ์˜ ๋ฐฉ์ •์‹ ํ•„์š”:
    • ๋์  ๋ณด๊ฐ„: 2n2n2n ๊ฐœ
    • ๊ตฌ๊ฐ„ ๊ฐ„ ์œ„์น˜ ๋ฐ 1์ฐจ ๋„ํ•จ์ˆ˜ ์—ฐ์†์„ฑ: (nโˆ’1)(n-1)(nโˆ’1)๊ฐœ์”ฉ ์ด 2(nโˆ’1)2(n-1)2(nโˆ’1) ๊ฐœ
    • 2์ฐจ ๋„ํ•จ์ˆ˜ ์—ฐ์†์„ฑ: (nโˆ’1)(n-1)(nโˆ’1) ๊ฐœ
    • ์–‘ ๋์ ์—์„œ 2์ฐจ ๋„ํ•จ์ˆ˜ 0 ์„ค์ •: xโ€ฒโ€ฒ(t0)=xโ€ฒโ€ฒ(tn)=0x''(t_0) = x''(t_n) = 0xโ€ฒโ€ฒ(t0โ€‹)=xโ€ฒโ€ฒ(tnโ€‹)=0
  • C2C^2C2 ์—ฐ์†์„ฑ, ๋กœ์ปฌ ์ œ์–ด ๋ถˆ๊ฐ€, ๋ณด๊ฐ„(interpolation) ๋ฐฉ์‹

B-splines (brief intro)

  • 4๊ฐœ์˜ ์ œ์–ด์ ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ค‘๊ฐ„ 2๊ฐœ๋งŒ ๊ทผ์‚ฌ
  • ๊ฒน์น˜๋Š” ์„ธ๊ทธ๋จผํŠธ๋“ค๋กœ ๊ณก์„  ์ƒ์„ฑ:
    • ์˜ˆ: 0-1-2-3, 1-2-3-4, 2-3-4-5, ...
  • C2C^2C2 ์—ฐ์†์„ฑ, ๋กœ์ปฌ ์ œ์–ด ๊ฐ€๋Šฅ, ๊ทผ์‚ฌ(approximation) ๋ฐฉ์‹

11 - Lab - Curves

๊ฐœ์š”

  • ์˜ˆ์ œ: ๋‹จ์ผ ๋ฒ ์ง€์— ๊ณก์„ (Bezier curve)์˜ ์ƒํ˜ธ์ž‘์šฉ์  ์กฐ์ž‘

[์ฝ”๋“œ] 1-interactive-cubic-bezier

์ œ์–ด์ (control point)์„ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ๊ณก์„ ์„ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ VAO

  • ์ œ์–ด์ ์šฉ VAO - g_vao_control_points
  • ๊ณก์„  ์ •์ ์šฉ VAO - g_vao_curve_points

ํ•˜๋‚˜์˜ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ

  • ์ œ์–ด์ ๊ณผ ๊ณก์„  ์ •์ ์€ ๋™์ผํ•œ ์…ฐ์ด๋” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋“ค์˜ ์ •์  ์†์„ฑ(vertex attribute)์€ ์ •์  ์œ„์น˜๋งŒ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ์ƒ‰์ƒ์€ uniform ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ „์—ญ ๋ณ€์ˆ˜

์ œ์–ด์ ๋“ค์˜ ์œ„์น˜๋ฅผ ์œ„ํ•œ ์ „์—ญ ๋ณ€์ˆ˜:

g_control_points = [
    glm.vec3(-150,   0, 0),
    glm.vec3( -50, 150, 0),
    glm.vec3(  50, 150, 0),
    glm.vec3( 150,   0, 0),
]

ํ˜„์žฌ '๋“œ๋ž˜๊ทธ' ์ค‘์ธ ์ œ์–ด์ ์˜ ์ธ๋ฑ์Šค๋ฅผ ์œ„ํ•œ ์ „์—ญ ๋ณ€์ˆ˜:

g_moving_index = None

์ด๋“ค์€ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ •์˜๋˜์–ด main() ๋ฐ ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์ ‘๊ทผํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์…ฐ์ด๋” ์ฝ”๋“œ

์ •์  ์…ฐ์ด๋” (Vertex shader):

#version 330 core
layout (location = 0) in vec3 vin_pos;
uniform mat4 MVP;
void main()
{
    gl_Position = MVP * vec4(vin_pos, 1.0);
}

ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋” (Fragment shader):

#version 330 core
out vec4 FragColor;
uniform vec4 color;
void main()
{
    FragColor = color;
}

์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ์ฝ”๋“œ

# VAO, VBO๋ฅผ ์ค€๋น„ํ•˜๋Š” ํ•จ์ˆ˜
# (์ฐธ๊ณ : ์Šฌ๋ผ์ด๋“œ์˜ ์ผ๋ถ€ ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋ ค์ ธ ์žˆ์–ด '...'๋กœ ํ‘œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.)
def prepare_control_points():
    # ์ •์  ๋ฐฐ์—ด ๊ฐ์ฒด(VAO)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:
    VAO = glGenVertexArrays(1)
    glBindVertexArray(VAO)
    
    # ์ •์  ๋ฒ„ํผ ๊ฐ์ฒด(VBO)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:
    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)
    
    # ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  VBO ๊ณต๊ฐ„๋งŒ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค (์„ธ ๋ฒˆ์งธ ์ธ์ž๋ฅผ None์œผ๋กœ ์ง€์ •).
    glBufferData(GL_ARRAY_BUFFER, ...) # ๊ฐ€๋ ค์ง„ ๋ถ€๋ถ„
    
    # ์ •์  ์†์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, ...) # ๊ฐ€๋ ค์ง„ ๋ถ€๋ถ„
    glEnableVertexAttribArray(0)
    
    # ์—…๋ฐ์ดํŠธ๋œ ์ •์  ์œ„์น˜๋ฅผ VBO๋กœ ๋ณต์‚ฌํ•  ๋•Œ ํ•„์š”ํ•˜๋ฏ€๋กœ VBO์™€ VAO๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    return VAO, VBO

# VBO ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜ (์‹ค์ œ ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜๋Š” ์ƒ๋žต๋จ)
def draw_control_points(vao, vbo):
    glBindVertexArray(vao)      # vao ํ™œ์„ฑํ™”
    glBindBuffer(GL_ARRAY_BUFFER, vbo) # vbo ํ™œ์„ฑํ™”
    
    # ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ค€๋น„
    vertices = glm.array(points)
    
    # ํ• ๋‹น ์—†์ด ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ VBO๋กœ ๋ณต์‚ฌ
    glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.nbytes, vertices.ptr)

# ์ œ์–ด์ ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฒ ์ง€์— ๊ณก์„  ์œ„์˜ ์ ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
def generate_curve_points(control_points):
    curve_points = []
    # for t in np.linspace(0, 1, 101): # linspace(์‹œ์ž‘, ๋, ๊ฐœ์ˆ˜)
    for t in np.arange(0, 1+1e-10, .01): # arange(์‹œ์ž‘, ๋, ๊ฐ„๊ฒฉ)
        
        T = np.array([t**3, t**2, t, 1])

        # ๋ฒ ์ง€์— ๊ธฐ์ € ํ–‰๋ ฌ (Bezier basis matrix)
        M = np.array([[-1,  3, -3, 1],
                      [ 3, -6,  3, 0],
                      [-3,  3,  0, 0],
                      [ 1,  0,  0, 0]])

        P = np.array(control_points)
        
        p = T @ M @ P
        
        curve_points.append(glm.vec3(p))
        
    return curve_points

๋ฉ”์ธ ํ•จ์ˆ˜ ๋ฐ ๋ Œ๋”๋ง ๋ฃจํ”„

def main():
    global g_vao_control_points, g_vao_curve_points
    # ์ œ์–ด์ (control points) vao์™€ vbo ์ค€๋น„
    g_vao_control_points, g_vbo_control_points = prepare_vao_for_points()

    # ์ดˆ๊ธฐ ๊ณก์„  ์ •์ (curve points) ์ƒ์„ฑ
    curve_points = generate_curve_points(g_control_points)

    # ๊ณก์„  ์ •์ (curve points) vao์™€ vbo ์ค€๋น„
    g_vao_curve_points, g_vbo_curve_points = prepare_vao_for_points()
    copy_points_data(curve_points, g_vbo_curve_points)

    # ์  ํฌ๊ธฐ ์„ค์ • (์ œ์–ด์  ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์œ„ํ•จ)
    glPointSize(20)

    while not glfw.WindowShouldClose(window):
        # ... ๋ Œ๋”๋ง ๋กœ์ง (์•„๋ž˜์— ๊ณ„์†) ...
        
        glUseProgram(shader_program)

        # ํˆฌ์˜ ํ–‰๋ ฌ & MVP ์œ ๋‹ˆํผ ์„ค์ •
        # ์นด๋ฉ”๋ผ ๊ณต๊ฐ„์ด glfw ํ™”๋ฉด ๊ณต๊ฐ„๊ณผ ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ–๋„๋ก ํ•จ
        P = glm.ortho(0, WINDOW_WIDTH, 0, WINDOW_HEIGHT, -1, 1)
        MVP = P
        glUniformMatrix4fv(unif_locs['MVP'], 1, GL_FALSE, glm.value_ptr(MVP))

        # ์ œ์–ด ํด๋ฆฌ๊ณค(control polygon) ๊ทธ๋ฆฌ๊ธฐ
        glUniform3f(unif_locs['color'], 0, 1, 0)
        glBindVertexArray(g_vao_control_points)
        glDrawArrays(GL_LINE_LOOP, 0, len(g_control_points))
        glDrawArrays(GL_POINTS, 0, len(g_control_points))

        # ๊ณก์„ (curve) ๊ทธ๋ฆฌ๊ธฐ
        glUniform3f(unif_locs['color'], 1, 1, 1)
        glBindVertexArray(g_vao_curve_points)
        glDrawArrays(GL_LINE_STRIP, 0, len(curve_points))
        
        # ...

์ด๋ฒคํŠธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

# ๋งˆ์šฐ์Šค ํด๋ฆญ์ด ์ œ์–ด์  ๊ทผ์ฒ˜์—์„œ ์ผ์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
def hittest(x, y, control_point):
    if glm.abs(x-control_point.x)<10 and glm.abs(y-control_point.y)<10:
        return True
    else:
        return False

# ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜
def button_callback(window, button, action, mod):
    global g_control_points, g_moving_index
    if button==glfw.MOUSE_BUTTON_LEFT:
        x, y = glfw.GetCursorPos(window)
        
        # glfw ํ™”๋ฉด ์ขŒํ‘œ(์ขŒ์ƒ๋‹จ ๊ธฐ์ค€)๋ฅผ 
        # ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์นด๋ฉ”๋ผ ๊ณต๊ฐ„ ์ขŒํ‘œ(์ขŒํ•˜๋‹จ ๊ธฐ์ค€)๋กœ ๋ณ€ํ™˜
        y = WINDOW_HEIGHT - y
        
        if action==glfw.PRESS:
            g_moving_index = None
            for i in range(len(g_control_points)):
                if hittest(x, y, g_control_points[i]):
                    g_moving_index = i
                    break
        elif action==glfw.RELEASE:
            g_moving_index = None

# ๋งˆ์šฐ์Šค ์ปค์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜
def cursor_callback(window, xpos, ypos):
    global g_control_points, g_moving_index
    global g_vbo_control_points, g_vbo_curve_points

    # ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์นด๋ฉ”๋ผ ๊ณต๊ฐ„ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜
    ypos = WINDOW_HEIGHT - ypos

    if g_moving_index is not None:
        # ์›€์ง์ด๋Š” ์ œ์–ด์ ์˜ ์œ„์น˜ ์—…๋ฐ์ดํŠธ
        g_control_points[g_moving_index].x = xpos
        g_control_points[g_moving_index].y = ypos

        # ์—…๋ฐ์ดํŠธ๋œ ์ œ์–ด์  ์œ„์น˜๋ฅผ g_vbo_control_points๋กœ ๋ณต์‚ฌ
        copy_points_data(g_control_points, g_vbo_control_points)

        # ์—…๋ฐ์ดํŠธ๋œ ์ œ์–ด์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ณก์„  ์ •์ ์„ ์ƒ์„ฑํ•˜๊ณ 
        # g_vbo_curve_points๋กœ ๋ณต์‚ฌ
        curve_points = generate_curve_points(g_control_points)
        copy_points_data(curve_points, g_vbo_curve_points)
์ตœ๊ทผ ์ˆ˜์ •:: 25. 6. 19. ์˜คํ›„ 8:26
Contributors: kmbzn
Prev
10 - Character Animation
Next
12 - More Lighting, Texture

BUILT WITH

CloudflareNode.jsGitHubGitVue.jsJavaScriptVSCodenpm

All trademarks and logos are property of their respective owners.
ยฉ 2025 kmbzn ยท MIT License