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:
- ์:
- ์ฅ์ : ๋ง ๋์ ํ๋ฉด ๊ฐ๋จํ ๊ณ์ฐ ๋ฐ ์๊ฐํ ๊ฐ๋ฅ
- ๋จ์ : ํ๋์ ์ ์ฌ๋ฌ ๊ฐ ๋์๋๋ ๊ฒฝ์ฐ ํํ ๋ถ๊ฐ (์, ์์ง์ ๋ฑ)
Implicit:
- ์:
- ์ฅ์ : ์ ์ด ๋ด๋ถ/์ธ๋ถ/๊ฒฝ๊ณ์ ์๋์ง ํ๋ณ ์ฌ์
- ๋จ์ : ์ขํ๋ฅผ ์์ฑํ๊ฑฐ๋ ์๊ฐํํ๊ธฐ์ ๋นํจ์จ์
Parametric:
- ์:
๊ฐ ์ ์ ์ถ๊ฐ ๋งค๊ฐ๋ณ์ ์ ํจ์๋ก ํํ๋จ
- ์ฅ์ : ์ ๊ฐ๋ง ๋ฃ์ผ๋ฉด ๊ณ์ฐ/์๊ฐํ ์ฉ์ด
- ๋ ๊ณก์ ์์ ์ ์ ๊ฒฐ์ ํ๋ "์ง์ญ ์ขํ๊ณ" ์ญํ ์ ํจ
Computer Graphics์์๋ ์ด parametric ํํ ๋ฐฉ์์ด ๊ฐ์ฅ ์ ํฉ
Polynomial Curve
๋คํญ์(Polynomial) ์ ์ปดํจํฐ ๊ทธ๋ํฝ์์ ๊ณก์ ์ ํํํ ๋ ์์ฃผ ์ฌ์ฉ๋จ
- ๋จ์ํจ
- ํจ์จ์
- ๋ค๋ฃจ๊ธฐ ์ฌ์
์ฐจ์๊ฐ ์ธ ๋คํญ์:
Polynomial Interpolation
- ๋คํญ์์ ์ฌ์ฉํด ๋ถ๋๋ฌ์ด ๊ณก์ ์ ๋ง๋๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ polynomial interpolation
- ์ฃผ์ด์ง ๋ฐ์ดํฐ ํฌ์ธํธ๋ค์ ํต๊ณผํ๋
ํน์ ํ ๋ถ๋๋ฌ์ด ๊ณก์ ์ ๊ฒฐ์ ํจ - 1์ฐจ ๋คํญ์(linear polynomial) ์ ์ด์ฉํ ์ ํ ๋ณด๊ฐ ์์
- ์ ๋ ฅ: ๋ ์
- ์ถ๋ ฅ: 1์ฐจ ๋คํญ์
- ๋ ์์ ์ธ์ ๊ณ์ , ์ ๊ตฌํ ์ ์์:
- ํ๋ ฌ ํํ๋ก ์ ๋ฆฌ ๊ฐ๋ฅ:
- , ๋ก ์ค์ ํ๋ฉด,
- 2์ฐจ ๋คํญ์(quadratic) ์ ์ด์ฉํ ๋ณด๊ฐ
- ์ ๋ ฅ: ์ธ ์
- 2์ฐจ ๋คํญ์:
- 3๊ฐ์ ๋ฏธ์ง์ , , ๋ฅผ ํ๊ธฐ ์ํด
3๊ฐ์ ์กฐ๊ฑด์ด ํ์ํจ โ 3๊ฐ์ ์ ์ด ํ์ - ํ๋ ฌ ํํ:
- ์ฐจ์ ์ ๋คํญ์์ ์ด์ฉํ ๋ณด๊ฐ
- ์ ๋ ฅ: ๊ฐ์ ์
- ๋คํญ์:
- ๊ณ์ ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ:
- 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)์ ํผํ ์ ์์
์ผ๋ฐ ํํ:
๋๋
Complex Curve from Cubic Polynomials?
- ๊ณก์ ์ด ๋ณต์กํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ง๋ค๊น?
- ํ๋์ 3์ฐจ ๋คํญ์๋ง์ผ๋ก๋ ํํ์ด ์ด๋ ค์
โ ํด๊ฒฐ์ฑ : Spline (๊ตฌ๊ฐ๋ณ ๋คํญ์, piecewise polynomial) - ์ง๊ธ์ ๋จผ์ ํ๋์ ๊ตฌ๊ฐ(segment)์ ์ง์คํด์ ์ดํด๋ด
Defining a Single Piece of Cubic Polynomial
๋คํญ์ ํํ:
๋ชฉํ: ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํน์ ํ ๋คํญ์ ๊ตฌํ๊ธฐ
- ์ฆ, , , , ๋ฅผ ๊ฒฐ์
์ด 4๊ฐ์ ๋ฏธ์ง์ โ 4๊ฐ์ ์กฐ๊ฑด ๋๋ ์ ์ด ํ์ํจ
์์ ์กฐ๊ฑด:
- ์ ๋ ์ ์ ์์น
- ์ ๋ ์ ์์์ ๊ธฐ์ธ๊ธฐ (๋ํจ์)
Formulation of a Single Piece of Polynomial
- ๋คํญ์์ ํํํ๋ ๋ ๊ฐ์ง ๋ฐฉ์:
๊ณ์์ ๋ณ์ ๊ธฐ๋ฐ:
- ๊ณ์:
- ๋ณ์:
๊ธฐ์ ํจ์์ ์ ๊ธฐ๋ฐ:
- ๊ธฐ์ ํจ์:
- ์ ์ด์ :
- ๊ฐ ์ ์ด ๊ณก์ ์ ๋ผ์น๋ ์ํฅ์ ๋์ํ๋ basis ํจ์๊ฐ ์กฐ์ ํจ
Trivial Example: Linear Polynomial
๋ ์ , ๋ฅผ ์ง๋๋ ์ง์
๋ค์๊ณผ ๊ฐ์ด 1์ฐจ ๋คํญ์์ผ๋ก ํํ ๊ฐ๋ฅ:
๊ณ์์ ๋ณ์ ๊ธฐ์ค ํํ:
๋ฒกํฐ ํํ:
ํ๋ ฌ ํํ ํํ:
- ์ฒซ ๋ฒ์งธ ๋ฒกํฐ: power basis vector
- ๋ ๋ฒ์งธ ํ๋ ฌ: basis matrix
- ์ธ ๋ฒ์งธ ๋ฒกํฐ: geometry vector
basis function๊ณผ ์ ์ด์ ๊ธฐ๋ฐ ํํ:
ํ๋ ฌ ๊ด์ ์ผ๋ก๋ ํด์ ๊ฐ๋ฅ:
์ด๋ , ๋ basis function ์ญํ
Meaning of Basis Functions
์ ํ ๋ณด๊ฐ์ basis ํจ์ ํด์:
๊ฐ ๋ฐ๋ ๋ ๊ฐ ์ ์ ๊ธฐ์ฌ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ:
Hermite Curve์ ๊ฐ๋ ๋ฐ ๋๊ธฐ
- Hermite curve๋ ์ผ๋ฐ์ ์ผ๋ก 3์ฐจ ๋คํญ์(cubic polynomia)์ผ๋ก ํํ๋๋ฉฐ,
Hermite ํ์์ผ๋ก ์ฃผ์ด์ง๋ค. - Spline ์ค๊ณ์์๋ ๊ณก์ ์กฐ๊ฐ๋ค ์ฌ์ด์ ๋ถ๋๋ฌ์ด ์ฐ๊ฒฐ(smooth connection) ์ด ์ค์
โ Hermite ๊ณก์ ์ ๋ค์์ ๋ช ์ํจ์ผ๋ก์จ ์ด๋ฅผ ํด๊ฒฐ:- ์ ๋์ ์ ์์น
- ์ ๋์ ์์์ 1์ฐจ ๋ํจ์ (๊ธฐ์ธ๊ธฐ, tangent)
- ์ ์ฝ ์กฐ๊ฑด:
๋์ , ๊ณผ ํด๋น ์ ์ ๋ฒกํฐ(๊ธฐ์ธ๊ธฐ) , ์ด ์ฃผ์ด์ง
Hermite Curve ์์ ์ ๋
3์ฐจ ๋คํญ์์ ์ผ๋ฐ ํํ:
์ ์ฝ ์กฐ๊ฑด:
๊ณ์ ๋์ถ:
ํ๋ ฌ ํํ๋ก ํํ:
Hermite Curve ํ๋ ฌ ํํ
- ํ๋ ฌ ํํ๊ฐ ํจ์ฌ ๊ฐ๋จํจ:
- ์ฆ,
- ์ฌ๊ธฐ์ basis ํจ์ ๋ ๊ณก์ ์์ ๊ฐ ์ ์ ์ํฅ๋๋ฅผ ์กฐ์ ํจ
Hermite Curve - Basis Functions ๊ด์
- ๋คํญ์ ํํ:
- ์ด๋ฅผ basis function๊ณผ ์ ์ผ๋ก ํํํ๋ฉด:
- ํ๋ ฌ ๊ด์ :
- ํ: ๊ณ์
- ์ด: basis function (์ฆ, , , , )
Hermite Curve - Basis Function ์๊ฐํ
- Hermite basis function ๋ค์ ์๊ฐ ์ ๋ณํ์ ๋ฐ๋ผ
๊ฐ ์ ์ด์ ๋ฐ ์ ์ ์ด ๊ณก์ ์ ๋ฏธ์น๋ ์ํฅ๋๋ฅผ ์กฐ์ - ๊ทธ๋ํ๋ฅผ ํตํด basis ํจ์ , , , ์ ๋ณํ๋ฅผ ํ์ธ ๊ฐ๋ฅ
[Demo] Hermite Curve
https://codepen.io/iIorda/pen/KrvBwr
- ๋์ ๊ณผ ์ ์ (๋ํจ์)์ ์์น๋ฅผ ๋๋๊ทธํ์ฌ
๊ณก์ ์ด ์ด๋ป๊ฒ ๋ณํ๋์ง ์ค์๊ฐ์ผ๋ก ํ์ธ
Bezier Curve
- Bezier ๊ณก์ ์ ์ผ๋ฐ์ ์ผ๋ก Bezier ํ์์ผ๋ก ํํ๋๋ ๋คํญ ๊ณก์ (polynomial curve)
- Motivation:
- Spline์์๋ ๋ถ๋๋ฌ์ด ๊ณก์ ์ฐ๊ฒฐ์ด ์ค์
- Bezier์์๋ ์ด๋ฅผ ์ํด ์ ์ด์ (control points) ์ ์ ์ ํ ๋ฐฐ์นํจ์ผ๋ก์จ ํด๊ฒฐ
Recall: Hermite curve
- ์ ์ฝ ์กฐ๊ฑด: ๋์ ๊ณผ ์ ์ (๋ํจ์)
- Hermite ๊ณก์ ์ ๋ค์๊ณผ ๊ฐ์ด ํํ๋จ:
Hermite to Bรฉzier
์ ๊ณผ ๋ฒกํฐ๋ฅผ ์์ด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ง๊ด์ ์ด์ง ์์
๋ฐ๋ผ์ ๋ฒกํฐ๋ฅผ ์ ์ ์ฐจ์ด๋ก ํํํ๋ ๋ฐฉ์์ด ๋ ๋ช ํ
์:
- ๋๋ ํํ๋ก ํํ ๊ฐ๋ฅ
Bezier ์ ์ด์ ๋ฐฉ์์ผ๋ก ๋ณํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์:
- Hermite ๊ณก์ ์ ์
๋ ฅ:
- , : ์์/์ข ๋ฃ ์ง์
- , : ์์/์ข ๋ฃ ์ ์ ๋ฒกํฐ
- Bezier ๊ณก์ ์ ์ ์ด์ :
- Hermite ๊ณก์ ์ ์
๋ ฅ:
๋๋ ์ญ์ผ๋ก ํํํ๋ฉด:
์ฌ๊ธฐ์ ๋ฏธ๋ถ๊ฐ์ 3๋ฐฐ scale๋ก ์ ์๋จ
(Bรฉzier ๊ณก์ ์ ๋ฏธ๋ถ ์ offset์ด ํฌํจ๋๋ฏ๋ก ์กฐ์ ํ์)
Hermite to Bรฉzier ๋ณํ (์์ฝ)
Hermite ํํ:
Hermite basis matrix์ Bezier ๋ณํ์ ๊ณฑํ๋ฉด:
Bรฉzier Matrix์ Bernstein Basis
Bรฉzier ํ๋ ฌ ํํ:
์ ํ๋ ฌ์ Bernstein ๋คํญ์์ ๊ธฐ๋ฐํจ:
์ด ํ๋ ฌ์ Bรฉzier ๊ณก์ ์ ์ด๋ค ์ฐจ์์์๋ ์ ์ํ ์ ์๊ฒ ํด์ค
Bรฉzier Curve
- Bernstein Basis Functions :
- Cubic Bรฉzier Curve ํํ:
- ์ ๊ฐ ํํ:
Bรฉzier Basis ์๊ฐํ
- ๋ค ๊ฐ์ Bernstein basis ํจ์๋ค์ด t ๊ฐ์ ๋ฐ๋ผ
๊ณก์ ์ ๋ฏธ์น๋ ์ํฅ์ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ค - ์ ์ด์ , , , ๊ฐ๊ฐ์
ํด๋น basis ํจ์์ ์ํด ์ํฅ์ ๋ฐ์
de Casteljauโs Algorithm
- Bezier curve๋ฅผ ๊ณ์ฐํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ
- ํ๋์ค์ Paul de Casteljau๊ฐ 1959๋
์ ๊ฐ๋ฐ
(๋น์ Citroรซn ๊ทผ๋ฌด ์ค์ด๋ผ ํ์ฌ ์ ์ฑ ์ ๋ ผ๋ฌธ ๋ฐํ๋ ๋ชปํจ)
Cubic Bezier Curve์ ์์
- ๋ค ๊ฐ์ ์ ์ด์ , , , ๋ก ์์
1๋จ๊ณ ๋ณด๊ฐ (1st level interpolation)
- ์ง์ ์์ ๋ณด๊ฐ:
2๋จ๊ณ ๋ณด๊ฐ (2nd level interpolation)
- ๋ค์ ์ง์ ๋ณด๊ฐ:
3๋จ๊ณ ๋ณด๊ฐ (์ต์ข ์ ๊ณ์ฐ)
- ๋ง์ง๋ง ๋ณด๊ฐ์ผ๋ก ๊ณก์ ์์ ์ ๊ณ์ฐ:
์๊ฐ์ ๋ฐ๋ณต ์์ฝ
- ๋ฐ๋ณต์ ๋ณด๊ฐ์ ํตํด Bezier ๊ณก์ ์์ ์ ๋ฅผ ๊ณ์ฐ
- ๋ชจ๋ ๋ณด๊ฐ์ ๋จ์ํ ์ ํ ๋ณด๊ฐ:
๋ณต์กํ ์์ (๊ณ ์ฐจ Bezier curve)
Berkeley ์๋ฃ ๊ธฐ์ค:
๋ค์ฐจ์ Bezier curve์์๋ ๋์ผํ๊ฒ ์ ์ฉ ๊ฐ๋ฅ๋ฐ๋ณต์ ์ธ ๋ณด๊ฐ์ ์ฌ๋ฌ ๋จ๊ณ ๊ฑฐ์น๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ์ ์ป์:
...
์ค์ ์์ ๋งํฌ: 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
- ๊ณก์ ์ ์๊ฐํํ๋ ค๋ฉด ์์ ์ฌ๋ฌ ์ ์ ๊ณ์ฐํ๊ณ
๊ทธ ์ ๋ค์ ์ ๋ถ์ผ๋ก ์ฐ๊ฒฐํ๋ฉด ๋จ - ๋ฐฉ๋ฒ๋ค:
- Brute-force: ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๊ฐ์ ๋ฐ๊พธ๋ฉฐ ์ง์ ๊ณ์ฐ
- 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 ๊ณก์ ์ ๊ณผ ์ ์ ํํ ํต๊ณผ
Spline
- Spline: ์กฐ๊ฐ๋ณ ๋คํญ์ (piecewise polynomial)
- ์ธ ๊ฐ์ง ์ฃผ์ ์ด์:
- ์ด ์กฐ๊ฐ๋ค์ ์ด๋ป๊ฒ ์ฐ์์ ์ผ๋ก ์ฐ๊ฒฐํ ๊ฒ์ธ๊ฐ?
- spline์ ํํ๋ฅผ ์ผ๋ง๋ ์ฝ๊ฒ ์ ์ดํ ์ ์๋๊ฐ?
- spline์ด ํน์ ํ ์ ๋ค์ ํต๊ณผํด์ผ ํ๋๊ฐ?
Continuity
https://math.hws.edu/graphicshook/demo/c2/cubic-bezier.html
- Bezier spline ๋ฐ๋ชจ์์ ํ์ธํด๋ณด์ธ์
- spline์ ์ด๋ป๊ฒ "๋ถ๋๋ฝ๊ฒ(smooth)" ๋ง๋ค ์ ์์๊น?
- ๋ถ๋๋ฌ์(Smoothness)์ ์ฐ์์ฑ์ ์ฐจ์(order) ๋ก ์ค๋ช
ํ ์ ์์
- 0์ฐจ ์ฐ์์ฑ :
์์ชฝ์์ ์์น(position) ๋ง ์ผ์น - 1์ฐจ ์ฐ์์ฑ :
์์น์ 1์ฐจ ๋ฏธ๋ถ(์๋, velocity) ์ผ์น - 2์ฐจ ์ฐ์์ฑ :
์์น, 1์ฐจ, 2์ฐจ ๋ฏธ๋ถ(๊ฐ์๋, acceleration) ๊น์ง ์ผ์น
- 0์ฐจ ์ฐ์์ฑ :
- ์๋ ๊ทธ๋ฆผ์ ์ฐจ์์ ๋ฐ๋ฅธ ์ฐ์์ฑ์ ์ฐจ์ด๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ค
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
- ์ฐ์์ฑ: ๋๋ ๊ฐ๋ฅ
- ๋ก์ปฌ ์ ์ด(Local controllability)
- ๋ณด๊ฐ(interpolation): ๋จ์ง ์ ๋ ๋ ์ ๋ง ํต๊ณผ
- Bezier spline์ ๋งค์ฐ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋จ:
- Adobe Illustrator ๊ฐ์ ๊ทธ๋ํฝ ๋๊ตฌ์์ ํํ(shape) ์์ฑ
- Blender, Maya ๋ฑ 3D ํด์์ ์ ๋๋ฉ์ด์ ๊ฒฝ๋ก ์ ์
- TrueType ํฐํธ๋ quadratic Bezier spline ์ฌ์ฉ
PostScript ํฐํธ๋ cubic Bezier spline ์ฌ์ฉ
Catmull-Rom Spline
์ฐ์๋ ๋ ์ ์ด์ ์ฌ์ด์ ํ๋์ Hermite ๊ณก์ ์ ์ ์
๋์ ์์์ ๋ํจ์(๊ธฐ์ธ๊ธฐ)๋ ์ธ์ ์ ์ด์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐํจ:
์ฐ์์ฑ, ๋ก์ปฌ ์ ์ด ๊ฐ๋ฅ, ๋ณด๊ฐ(interpolation) ๊ฐ๋ฅ
Natural Cubic Splines
- ๋ชฉํ: ๋ ๋์ ์ฐ์์ฑ, ์ต์ ์ฐ์์ฑ
- ๊ฐ์ ๋ฏธ์ง์ (n๊ฐ์ 3์ฐจ ๋คํญ ๊ตฌ๊ฐ ๊ฐ๊ฐ์ ๊ณ์)
- ๊ฐ์ ๋ฐฉ์ ์ ํ์:
- ๋์ ๋ณด๊ฐ: ๊ฐ
- ๊ตฌ๊ฐ ๊ฐ ์์น ๋ฐ 1์ฐจ ๋ํจ์ ์ฐ์์ฑ: ๊ฐ์ฉ ์ด ๊ฐ
- 2์ฐจ ๋ํจ์ ์ฐ์์ฑ: ๊ฐ
- ์ ๋์ ์์ 2์ฐจ ๋ํจ์ 0 ์ค์ :
- ์ฐ์์ฑ, ๋ก์ปฌ ์ ์ด ๋ถ๊ฐ, ๋ณด๊ฐ(interpolation) ๋ฐฉ์
B-splines (brief intro)
- 4๊ฐ์ ์ ์ด์ ์ ์ฌ์ฉํ์ง๋ง, ์ค๊ฐ 2๊ฐ๋ง ๊ทผ์ฌ
- ๊ฒน์น๋ ์ธ๊ทธ๋จผํธ๋ค๋ก ๊ณก์ ์์ฑ:
- ์: 0-1-2-3, 1-2-3-4, 2-3-4-5, ...
- ์ฐ์์ฑ, ๋ก์ปฌ ์ ์ด ๊ฐ๋ฅ, ๊ทผ์ฌ(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)