Geometriai modellezésGeometriai modellezés
Szirmay-Kalos László
Virtuális világ létrehozásaVirtuális világ létrehozása
Geometria– 2D: pont, síkgörbe, terület, fraktál (D2)– 3D: pont, térgörbe, felület, test, fraktál (D3)
Transzformáció (mozgatás) Optikai tulajdonságok
GörbékGörbék: : 1D ponthalmazok1D ponthalmazokA pontok koordinátái kielégítenek egy egyenletet:
– implicit: f(x, y) = 0 f(r) = 0 2D egyenes: ax + by + c = 0 Kör: (x–x0)2+(y–y0)2–R2 = 0 |r – r0 |2 – R2 = 0
– parametrikus: x = x(t), y = y(t) r = r(t) 3D egyenes:
Kör: t [0,1]
x(t) = x0 + R cos 2t r = r0 + R(cos 2t, sin 2t) y(t) = y0 + R sin 2t
– explicit: y = F(x) 2D egyenes: y = mx + b
n(r – r0) = 0
r = r0 + v t, t [-∞,∞]x = x0 + vx ty = y0 + vy tz = z0 + vz t
Szabadformájú görbékSzabadformájú görbék Definíció vezérlőpontokkal
Polinom: x(t) = ai ti, y(t) = bi ti
Polinom együtthatók:– Interpoláció– Approximáció
Lagrange Lagrange interpolációinterpoláció
Vezérlő pontok: r1, r2, r3,..., rn
Keresd: r(t) = [ai, bi ] ti amelyre
r(t1) = r1, r(t2) = r2, … , r(tn) = rn,
Megoldás:
– r(t) = Li(t) ri
Li(t) = j i (t-tj)
j i (ti-tj)Li(tk) =
1 if i=k
0 egyébként
r(tk) = rk
r1
r2
rn
t1 t2 tn
r(t) ?
LagrangeLagrangeCurveCurveclass LagrangeCurve { vector<Vector> cps; // control points vector<float> ts; // parameter (knot) values
float L(int i, float t) {float Li = 1.0f;
for(int j = 0; j < cps.size(); j++)if (j != i) Li *= (t – ts[j])/(ts[i] – ts[j]);
return Li; }public: void AddControlPoint(Vector cp) {
float ti = cps.size(); // or something bettercps.push_back(cp); ts.push_back(ti);
}
Vector r(float t) {Vector rr(0, 0, 0);
for(int i = 0; i < cps.size(); i++) rr += cps[i] * L(i,t); return rr; }};
Lagrange interpoláció Lagrange interpoláció bázisfüggvényeibázisfüggvényei
r(t) = Li(t) riLi(t) = j i (t-tj)
j i (ti-tj)
0
1
1
0.33 0.67
Lagrange interpoláció Lagrange interpoláció problémáiproblémái
Hermite interpHermite interpolációoláció
r(t) = a3(t-ti)3+a2(t-ti)2+a1(t-ti)+a0
ri’(t) = 3a3(t-ti)2+2a2(t-ti)+a1
r(ti) = a0 = pi
r(ti+1) = a3(ti+1-ti)3+a2(ti+1-ti)2+a1(ti+1-ti)+a0 = pi+1
r’(ti) = a1 = vi
r’(ti+1) = 3a3(ti+1-ti)2+2a2(ti+1-ti)+a1 = vi+1
pi
=r’(ti)
=r ’(ti+1)
=r(ti+1)ti
ti+1 pi+1
a0= pi
a1= vi
a2 = -
a3 = +
3(pi+1 - pi)(ti+1- ti)2
vi+1+2vi
(ti+1- ti)2(pi - pi+1)(ti+1- ti)3
vi+1+vi
(ti+1- ti)2
=r(ti)
vi
vi+1
Bezier approximációBezier approximáció
Keresd: r(t) = Bi(t) ri
– Bi(t): ne oszcilláljon
– Konvex burok tulajdonság
– Bi(t) 0, Bi(t) = 1
r2
r0
r1r3
B0(t) B1(t)B2(t)
B3(t)
r(t)
1n = (t+(1-t))n = t i (1-t)n-ini( )
Bi(t)
Bernstein polBernstein polinomokinomok
i=0
n
Bi(t) 0, Bi(t) = 1: OK
Newton féle binomiális tétel
Bezier approximBezier approximációáció
Bi(t) = t i (1-t)n-i( )n
ir(t) = Bi(t) ri
0
1
1
n = 3
BezierCurveBezierCurve
class BezierCurve { vector<Vector> cps; // control points
float B(int i, float t) {int n = p.size()-1; // n deg polynomial = n+1 pts!
float choose = 1; for(int j = 1; j <= i; j++) choose *= (float)(n-j+1)/j; return choose * pow(t, i) * pow(1-t, np-i); }public: void AddControlPoint(Vector cp) { cps.push_back(cp); }
Vector r(float t) {Vector rr(0, 0);
for(int i = 0; i < cps.size(); i++) rr += cps[i] * B(i,t); return rr; }};
Catmull-Rom splineCatmull-Rom spline
t0 ti-1 ti ti+1 tn
r0
ri-1
ri
ri+1
rn
vi =12
ri+1 - ri
ti+1 - ti
ri - ri-1
ti - ti-1+
vi
Egy görbeszegmens: Hermite interpolációLegeslegelső és legutolsó sebesség explicite
vi+1
Minden két vezérlőpont közé egy görbe szegmensSimaság: a sebesség is legyen közös két egymásutánira
FelületekFelületek Felület a 3D tér 2D részhalmaza:
– Koordináták kielégítenek egy egyenletet– implicit: f(x, y, z) = 0
gömb: (x - x0)2 + (y - y0)2 + (z - z0)2 - R2 = 0
– parametrikus: x = x(u,v), y = y(u,v), z = z(u,v),
u,v [0,1] gömb x = x0 + R cos 2u sin v
y = y0 + R sin 2u sin v z = z0 + R cos v
u,v [0,1]
– explicit (magasságmező):
z = h(x,y)
Szabadformájú görbékSzabadformájú görbék: : rr((u,vu,v)) Definíció vezérlőpontokkal
r(u,v) = rv(u) = Bi (u) ri (v)
ri (v) = Bj(v) ri,j
r(u,v) = Bi (u) Bj(v) ri,j
Szabadformájú felületekSzabadformájú felületek Vezérlő háló:
r(u,v) = Bi,j (u,v) ri, j
= Bi(u) Bj(v) ri, j
Vezérlőpontok módosításaVezérlőpontok módosítása
Poligonháló finomításaPoligonháló finomítása
Subdivision görbékSubdivision görbék
= 1/2 + 1/4
Catmull-ClarkCatmull-Clark subdivision felületsubdivision felület
= 1/4i = 1/2
= 1/v2 +2/v2 +(v-3)/vi
= 1/4 + 1/2 i
Durva poligon modellDurva poligon modell
Subdivision: 1. szintSubdivision: 1. szint
Subdivision: 2. szintSubdivision: 2. szint
TestekTestek
Ellenpéldák
Érvényes test: – Nem lehet alacsonyabb dimenziójú elfajulás
Érvényes testet eredményező módszerek– 2.5 dimenziós eljárások
– B-rep
– Constructive Solid Geometry
B-repB-rep
Test = határoló felületek
Topológiai érvényesség (Euler tétel ha egy darabból áll és nincsenek benne lyukak) :
csúcsok + lapok= élek + 2
Euler operátorokEuler operátorok Lap kihúzás
Lap felvágás
Él törlés Csúcs szétvágás
Kezdeti testKezdeti test
Lap kihúzásLap kihúzás
Lap kihúzásLap kihúzás
Még egyMég egy
Még mindigMég mindig
Subdivision simításSubdivision simítás
Top Related