geometriai modellezés szirmay-kalos lászló. virtuális világ létrehozása l geometria –2d:...
TRANSCRIPT
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