Így első nekifutásra nézzük, hogy mik azok a Bezier görbék.

Pierre Bezier "fejlesztette ki" a képletet a 70-es években, CAD/CAM alkalmazások részére. Azóta szerves részévé vált megannyi rajzoló és tervezőprogramnak. Egy kis ügyeskedéssel még realtime is számolhatjuk, szóval még akár egy demo-t is lehet rá építeni.
Ennyi a rizsa.

Nézzük a matematikai részét:

Így első nekifutásra a legegyszerűbb, leggyakrabban használt fajtájával, a harmadfokú Bezier görbével ismerkedjünk meg. Ennek jellemzője, hogy négy pont határozza meg. Egy kezdőpont, egy végpont, és két "iránypont". Lássuk:


 

Ezt a görbét egy  harmadfokú egyenlet írja le:
T 0-tol 1-ig megy

Q(t)=At3 + Bt2 + Ct + D

Az A, B, és C együtthatók kiszámolása:
C = 3 (P2 - P1)
B = 3 (P3 - P2) - C
A = P4 -P1 - C -B

Az A,B,C,p1,p2,p3,p4 betűk természetesen pontokat (3/2 D-s vektorok)jelentenek. A képleteket és az egyenletet külön-külön kell alkalmazni X,Y,Z koordinátákra. Így, ha térben számolunk 9 állandónk lesz. A t értékét 0-tól 1-ig kell léptetni, tetszőleges lépésközzel, attól függően, hogy hány pontot akarunk a görbéből. Ha N darab pontot akarunk, akkor a lépésköz értelemszerűen 1/(N-1).

Síkban számolva nem kell a Z koordináta, így egy egyszerű síkbeli Bezier görbét kapunk. Ez az első példaprogram.

A RealTime Számolás

Ez a képlet egy RealTime számoláshoz nem valami optimális. Ahelyett, hogy minden egyes t-re kiszámolnánk a függvény értékét, valamiféle lépésközökkel mindig azt a következő értéket kapnánk meg, ami kell. Ahogy minden más effekt-nél interpolálni kell. Mivel e képlet igen messze van a lineáristól, az egyszerű lépésközös megoldást el is felejthetjük. A trükk az, hogy a lépésközökhöz is lépésközöket adunk,  sőt, a lépésközök lépésközeihez is lépésközt adunk. Valahogy így:

X:=X+xdelta1; xdelta:=xdelta+xdelta2; xdelta2:=xdelta2+xdelta3; Y:=Y+ydelta1; ydelta:=ydelta+ydelta2;    ydelta2:=ydelta2+ydelta3; Z:=Z+zdelta1;  zdelta:=zdelta+zdelta2;     zdelta2:=zdelta2+zdelta3;
Ezzel az interpoláció már nem lineáris, hanem harmadfokú, és az eredmény egész jó.
Ezek a lépésközök:

delta1=A*(1/N)3 + B*(1/N)2 + C*(1/N);
delta2=6*A*(1/N)3 + 2*B*(1/N)2
delta3=6*A*(1/N)3

A változók persze itt is 3D-s vektorokat jelentenek

Hogy miért pont ezek a képletek?
Hát valaki nekem is elmagyarázhatná.

Ezzel az interpolációval számol a második példaprogram. A képernyőn ugyanazt fogja látni mindenki, mint az előzőnél (remélem), a forráskódban a lényeg.

Ha már tudunk Realtime görbéket számolgatni, essünk neki a nehezének.

Bezier felületek  (surfaces)

A Bezier felület elméletileg sima liba. Ez egy olyan felület, melyet térbeli Bezier görbék alkotnak. Ezzel aztán ki vagyunk segítve. Valahogy így néz ki:

Egy harmadfokú Bezier görbét 4 pont határoz meg. Nevezik őket Control Points -nak is. Nyilvánvaló, hogy akkor tudunk felületet felépíteni, ha hosszában és keresztben is ki tudjuk számolni a térbeli görbéinket. Ebből következik, hogy a legegyszerűbb Bezier felületet 4X4 pont határozza meg. Ez 16 Control Point. A fenti ábrán sárgával a felület dróthálója,  pirossal a Control Point-ok által meghatározott drótháló látható. Csak a négy sarkon ér össze a két drótháló és csak 4 Control Point van rajta a felületen, a többi csak a "görbítési irányt" mutatja.

Egy Control Point Mátrix:
A piros pontok a Control Point-ok, a zöld vonalak azok a görbék, melynek pontjaiból kijön a felület térhálója, a kék vonalak pedig azok a görbék, melyek meghatározzák a zöldeket.

A felület létrehozásához nem elég egyszerre egy görbét számolni, hiszen a hosszanti görbék fogják meghatározni, a keresztben futók pontjait és viszont. Egyszerre számoljuk a kék görbéken (most vonal) lévő pontokat (C1, C2, C3, C4) 1/N lépésenként. Ezeknek az éppen aktuális pontja fog Control Point-ként szolgálni a zöldek kiszámolásához, amely számolás során kijövő pontok alkotják majd a térhálót. Ezt a görbét mondjuk 1/M lépésenként számoljuk.

Tehát röviden: a kék görbék (C1, C2, C3, C4) által meghatározott négy pont lesz a zöldek Control Point-ja.

Lesz egy külső ciklus, ami a 4 hosszantit számolja egyszerre, meg egy belső, ami mindig egy keresztbenit számol.

Pszeudokódban valahogy így:

For t=0 to 1 in steps of 1/n          P1=C1(t)          P2=C2(t)          P3=C4(t)          P4=C5(t)          For s=0 to 1 in steps of 1/m                 Plot Point Q(s)         End End
Ha ezt értjük, akkor itt is be kell vezetni az interpolációt, mert a görbe képletével számolva elég lassú eredményt kapunk. Ez azt jelenti, hogy a 4 hosszanti görbét egyszerre interpoláljuk, amihez 4*9 lépésközre lesz szükségünk. Legegyszerűbb gyártani egy rekordot a lépésközöknek, hogy ne legyen  keveredés.

Progi:
 

Procedure
BezierSurface; var
C1,C2,C3,C4 : BezierCurve;     P1,P2,P3,P4 : Point3D;     u,v : integer;begin     InitCurve(C1,cp[1,1],cp[1,2],cp[1,3],cp[1,4],VRES);     InitCurve(C2,cp[2,1],cp[2,2],cp[2,3],cp[2,4],VRES);     InitCurve(C3,cp[3,1],cp[3,2],cp[3,3],cp[3,4],VRES);     InitCurve(C4,cp[4,1],cp[4,2],cp[4,3],cp[4,4],VRES);
    for v:=1 to Vres do     begin
    P1.x:=round(C1.X);P1.y:=round(C1.Y); P1.z:=round(C1.Z);         P2.x:=round(C2.X);P2.y:=round(C2.Y); P2.z:=round(C2.Z);        P3.x:=round(C3.X);P3.y:=round(C3.Y); P3.z:=round(C3.Z);        P4.x:=round(C4.X);P4.y:=round(C4.Y); P4.z:=round(C4.Z);         DoCurve(p1,p2,p3,p4,v); StepCurve(C1); StepCurve(C2); StepCurve(C3); StepCurve(C4);
        end; end;
    procedure DoCurve(p1,p2,p3,p4 : point3D; v : integer); var C : BezierCurve;     u : integer;begin      InitCurve(C,p1,p2,p3,p4,URES);      for u:=1 to URES do      begin         outpoints[u,v].x:=round(C.X);         outpoints[u,v].y:=round(C.Y);         outpoints[u,v].z:=round(C.Z);         StepCurve(C);     end; end;
A cp mátrix tartalmazza a Control Point-okat, Vres ill Hres konstans pedig a hosszan illetve keresztbe elhelyezkedő térháló-pontokat. Az InitCurve kiszámolja a lépésközöket, és tárolja a rekordban; a StepCurve lépteti a görbék aktuális értékeit; a DoCurve pedig a keresztbeni görbét és a térhálópontokat számolja.

A harmadik példaprogram véletlenszerűen felölti a Control Point mátrixot, és felületet generál hozzá. Pirossal a Control Point-ok.

Ha ez megvan, nézzük, hogyan lehet nagyobb felületet csinálni. Ha az eddigiek alapján akarjuk megtenni, beleütközünk a 4X4-es határba. Azt viszont senki nem mondta, hogy nem rakhatunk egymás mellé több ilyen kis síkot. Így egységenként ki is tudjuk rajzolni. Csak arra kell vigyázni, hogy ott kezdük a Control Point mátrixban a következő síkot, ahol az előzőnek vége volt. Tehát egy Control Point két 4X4-es felülethez fog tartozni. Ezért 4 db 4X4-es felületet egy 7X7-es Control Point mátrixból tudunk csinálni.

Ezt csinálja a negyedik példaprogram.
Erről ennyit.