**NURBS** ir matemātisks modelis, kas lielākoties tiek lietots datorgrafikā, lai radītu un attēlotu līknes vai izliektas virsmas.

Vēsture
-------

NURBS attīstība aizsākās 20. gs 50.gados. Nepieciešamība pēc matemātiski precīziem brīvu formu virsmu attēlojumiem, radās autobūves un kuģubūves industrijā. To noteica vajadzība izstrādāto virsbūves modeli izmainīt atbilstoši tehnoloģiskajiem jaunievedumiem. Tā kā līdz minētajam laikam, galaprodukta virsmas attēlojums pastāvēja kā viens, dizainera izstrādāts modelis, tā tālāka izmantošana vai pat izmainīšana bija neiespējama. Par attīstības pionieriem tiek uzskatīti francūži — Pierre Bézier un Paul de Casteljau, kuri darbojoties vienā jomā (abi bija inženieri autobūves uzņēmumus. P.Bézier — Renault un P.de Casteljau — Citroën) un strādājot pie pētījumiem par liektajām virsmām, viens par otra eksistenci pat nenojauta. Par iemeslu tam, ka NURBS līknes lietotājam, kas nav speciālists datorgrafikas jomā, ir pazīstamas kā Bézier līknes, kalpo tas, ka viņš savus pētījumus publicēja pirms to paspēja izdarīt de Casteljau. Viņa vārds labāk zināms saistībā ar algoritmiem, kurus Casteljau izveidoja lai skaitliski izteiktu virsmas, kuras līdz tam raksturoja parametri. 

Sākotnēji NURBS tika izmantoti tikai patentētajās CAD paketēs, kas domātas auto ražošanas kompānijām. Vēlāk tās kļuva par standarta datorgrafikas pakešu sastāvdaļu. 

Real-time un interaktīvā NURBS līkņu un virsmu renderēšana pirmoreiz kļuva iespējama, izmantojot Silicon Graphics darba staciju 1989.gadā. 1993.gadā tika izstrādāts pirmais interaktīvais NURBS modelētājs — NöRBS, kas bija domāts personālajiem datoriem (PC). Tās izstrādātāji bija neliela kompānija CAS Berlin, kas sadarbojās ar Berlīnes Tehnisko universitāti. Mūsdienās lielākā daļa profesionālo datorgrafikas lietojumprogrammu , kas paredz strādāt izmantojot darbvirsmu (desktop), piedāvā NURBS tehnoloģijas, kas visbiežāk tiek realizētas integrējot NURBS darbības mehānismu, ko izstrādājusi specializēta kompānija.

Izmantošana
-----------

NURBS ir praktiski neaizvietojama visās CAD (computer aided — design), CAM (computer aided — manufacturing) un CAE (computer aided — engineering) programmās. Lai arī NURBS ir daļa no daudzās jomās izmantotajiem standartiem (IGES, STEP,ACIS, PHIGS), tomēr joprojām pastāv daudzas neskaidrības par NURBS priekšrocībām un lietderību interaktīvās modelēšanas sakarā. To galvenais iemesls ir tas, ka NURBS rediģēšana un modelēšana ir vairāk intuitīva. Lielākoties tā balstīta uz zināšanām par konkrētu programmatūras paketi un tās lietojamību.

Līknes modelēšanai tiek izmantoti kontroles punkti. Tie vienmēr ir tieši saistīti ar līkni/virsmu vai nu atrodoties tieši uz tās vai arī darbojoties kā gumijas saites savienojums.

Atkarībā no lietotāja interfeisa, rediģēšanu var realizēt caur elementa kontrolpunktiem (parasti izmanto darbam ar Bézier līknēm) vai caur augstāka līmeņa rīkiem ( piemēram, spline modeling, hierarchial editing).

Augstākā līmeņa rīki dod iespēju objektus veidot izmantojot dažāda veida virsmas nepārtrauktību. Virsmas nepārtrauktībai ir galvenā loma objekta izskata kvalitātē. 

Pozicionālā nepārtrauktība (apzīmē ar G0) — divu līkņu vai virsmu savienojumi ir nejauši. Līknes un virsmas var savienoties noteiktā leņķī (veidojas asi leņķi, malas). Šajā gadījumā, izgaismojot objektu, būs skaidri redzamas gaismas lūzuma vietas.

Tangenciālā nepārtrauktība (apzīmē ar G1) — nepieciešams, lai līkņu beigu vektori būtu paralēli, tādējādi tiek izslēgta iespēja veidoties asām šķautnēm. Gaismas staram krītot uz tangenciāli savienotām šķautnēm, neveidojas lauzta gaismas līnija. Tā kā objekta izskats ir pietiekami dabīgs, veidojot objektus bieži apmierinās arī ar šo virsmas nepārtrauktības pakāpi. 

Līknes nepārtrauktība ( Curvature continuity/apzīmē ar G2) — nepieciešams lai beigu vektori būtu vienāda garuma. Gaismēnas, kas krīt uz šādi veidotas virsmas, nemainās ne mazākajā mērā. Divas blakus esošās virsmas ir savienotas tā, ka uztveras kā viena vesela. Šis nepārtrauktības līmenis ir lietderīgs radot modeļus, kas prasa veidot nepārtrauktu virsmu, izmantojot neskaitāmus BI CUBIC laukumus. 

Pirmā un otrā līmeņa ģeometriskā nepārtrauktība praktisku iemeslu dēļ ir identiska pozicionālajai un tangenciālajai nepārtrauktībai. Tieši līmeņa ģeometriskā nepārtrauktība (C2) atšķiras no līknes nepārtrauktības (G2)ar to, ka tās parametrizācija arī ir nepārtraukta. Praksē C2 nepārtrauktība ir vieglāk sasniedzama, ja tiek lietotas vienāda Bézier līknes.

*Compute Graphics — Principles and Practic* piedāvā vēl vienu kontinuitātes Cn definīciju. Tā ir izmantojama līknēm un virsmām, kuru pamatfunkcija ir augstāka par 3 o pakāpi (kubiska). Tā pieprasa lai virsmu savienojuma vietā sakristu gan to virzieni, gan pakāpju atvasinājums. Galvenā atšķirība starp definīcijām ir prasība, ka jāsakrīt lielumiem. Turklāt G1 nepārtrauktība ir vājināta, jo pieprasa tikai paralēlu tangenciālo vektoru sakritību, bet C1 nepārtrauktība prasa gan vektoru virzienu, gan lielumu sakritību. 

Virsmas pārbaudei var izmantot gaismas efektus un atspīdumus, kuru projekcijas uz objektiem parāda to virsmas īpašības. Perfekti gludu virsmu iespējams iegūt tikai izmantojot G2 pakāpes NURBS virsmas nepārtrauktību. 
Pārbaudei lieto metodes, kas darbojas tāpat kā uz virsmas atstarotas baltas svītras. Tās atklāj katru mazāko novirzi vai atkāpi no virsmas. Arī šīs metodes pirmsākumi radušies autobūves industrijā, kur virsmas kvalitāte tiek pārbaudīta automašīnas virsmu apgaismojot ar neona lampām, kas izvietotas pie griestiem. Metode pazīstama arī kā ‘’Zebras analīze’’.

Tehniskā specifikācija
----------------------

NURBS līkne tiek specificēta pēc tās secības, pēc kontrolpunktu komplektiem un mezglu vektoriem.
NURBS līknes un virsmas ir abu: B — līknes un Bézier līknes un virsmu apvienojums, vispārinājums. Galvenā atšķirības būtība ir kontrolpunktu izvietošanā, kas padara NURBS līknes racionālas. NURBS līknes attīstās tikai vienā parametru virzienā, kas parasti tiek saukts par „s" vai „u", savukārt NURBS virsmas attīstās divos parametru virzienos, sauktos „s", „t" vai „u" un „v". 
Vērtējot NURBS līkni dažādās parametru vērtībās, līkne var tikt attēlota divu vai trīs dimensiju telpā. Tāpat vērtējot NURBS virsmu dažādās vērtībās divos parametros, virsma tiek attēlota Dekarta koordinātu sistēmā. 
Iemesli, kāpēc NURBS virsmas ir noderīgas:
1.Tās ir programmisks objekts, kas paliek nemainīgs pārvietojumu rezultātā
2.Tās piedāvā vienu kopīgu matemātisku formu gan standarta analītiskām formām (piemēram, konusiem), gan brīvas formas objektiem
3.Tās nodrošina elastīgu dizainu plašam klāstam formu
4.Tās samazina atmiņas patēriņu
5.Tās var ātri tikt pārveidotas, izmantojot precīzus algoritmus
6.Tās ir neracionālo B — līkņu un Bézier līkņu un virsmu apkopojumi

### Kontrolpunkti

Kontrolpunkti nosaka līknes formu. Parasti katrs līknes punkts tiek aprēķināts, izmantojot kontrolpunktu kārtas numuru summu. Intervāla robežās ietekme mainās, atsaucoties uz polinoma funkcijām (pamatfunkcijas) zināmā pakāpē. Intervāla robežās bāzes funkcijas vienmērīgi tuvojās nullei. Piemēram, bāzes funkcija pirmajā pakāpē ir trijstūra funkcijā. Tā pieaug no 0 līdz 1, tad atkal krīt līdz 0. Kamēr tā pieaug, iepriekšējā kontrolpunkta bāzes funkcija krīt. Šādā veidā līkne interpolē starp diviem punktiem un rezultējošā līkne ir daudzstūris, kas ir pastāvīgs, vai mezgli. 
Augstāku pakāpju polinomiem, attiecīgi, ir vairāk pastāvīgu atvasinājumu. Intervāla robežās polinoma bāzes funkcijas daba un konstrukcijas linearitāte veido līkni perfekti gludu, pārtraukumi var rasties tikai mezglos. 
Fakts, ka viens kontrolpunkts ietekmē tikai tos intervālus, kur tas ir aktīvs, ir ļoti vērtīga īpašība, saukta „local support" (vietējais atbalsts). Modelējot, tas atļauj mainīt kādu virsmas daļu, saglabājot pārējās nemainīgas. Pievienojot vairāk kontrolpunktus, var panākt maksimālu tuvinājumu reālajam objektam, lai gan tikai daži līkņu veidi var tikt attēloti ar ierobežotu kontrolpunktu skaitu. NURBS līknes arī attēlo skalāru nozīmi katram kontrolpunktam. Tas dod lielāku kontroli pār līknes virsmu bez pārmērīgi daudz kontrolpunktu ieviešanas. 
Kontrolpunktiem var būt jebkura dimensija. Vienas dimensijas punkti definē tikai skalāro parametra funkciju. Tas parasti tiek lietots attēlu apstrādes programmās, lai koriģētu spilgtuma un krāsu līknes. Trīs dimensiju kontrolpunkti tiek lietoti 3D modelēšanā. Daudzdimensiju punkti var tikt izmantoti, piemēram, robota rokas modelēšanā ar dažādu stāvokļu un rotēšanas iespējām. NURBS virsmas ir tikai tā lietotne. Katrs kontrolpunkts patiesībā ir pilns kontrolpunktu vektors, kas veido līkni.

### Mezgla vektors

Mezgla vektors ir parametra vērtību secība, kas nosaka, kur un kā kontrolpunkti ietekmē NURBS līknes. Mezglu skaits vienmēr ir vienāds ar kontrolpunktu skaitu plus līknes pakāpe un plus 1. Mezgla vektors sadala parametra telpu intervālos — mezglu hordās. Vienmēr, kad ar parametra vērtību tiek ievadīta jauna mezgla horda, kļūst aktīvs jauns kontrolpunkts, kamēr vecais kontrolpunkts tiek atmests. Izriet, ka mezglu vektoru vērtībām jābūt pieaugošā secībā, piemēram (0, 0, 1, 2, 3, 3) ir derīgs, kamēr (0, 0, 2, 1, 3, 3) nav. Sekojošiem mezgliem ir tās pašas vērtības. Tas tad nosaka nulles garuma mezglu hordu, kas nozīmē, ka divi kontrolpunkti ir aktivizēti vienā laikā (paralēli divi kontrolpunkti kļūst neaktīvi). Tam ir ietekme uz gala līknes nepārtrauktību vai tās augstāku atvasinājumu, piemēram, tas ļauj veidot stūrus citādi gludā NURBS līknē. Mezgla daudzveidība ir limitēta ar līknes pakāpi. Pirmās pakāpes NURBS — iem katrs mezgls ir pārī ar kontrolpunktu.

Vektors parasti sākās ar mezglu, kura daudzveidība ir vienāda ar tā pakāpi. Tam ir nozīme, kad tas aktivizē kontrolpunktus, kuriem ir ietekme uz pirmā mezgla hordu. Līknes ar šādiem mezglu vektoriem sākās un beidzās kontrolpunktā.

Individuālās mezglu vērtības pašas par sevi nav nozīmīgas. Svarīga ir atšķirības proporcija starp mezglu vērtībām. Tādējādi, mezglu vektori (0, 0, 1, 2, 3, 3) un (0, 0, 2, 4, 6, 6) rada vienādas līknes. Mezglu vērtību pozīcijas ietekmē parametru telpas attēlošanu uz līknes telpas. NURBS līknes renderēšana parasti tiek veikta pārvietojoties ar noteiktiem attālumiem caur parametru virkni. Izmantojot mezglu hordu garumus, var tikt izmantoti vairāk paraug punktu reģionos, kur ir augsti izliekumi.

Cits izmantošanas veids ir situācijās, kur parametra vērtībai ir fizikāla nozīme, piemēram, ja parametrs ir laiks un līkne attēlo robota rokas kustību. Mezglu hordu garumi tad pārveidojās ātrumā un paātrinājumā, kas ir pamats, lai nerastos vizuāli priekšmeta bojājumi. Šī novietojuma elastība ir tas, ko nozīmē frāze "non uniform" (daudzveidīgs). Nepieciešami tikai priekš iekšējām kalkulācijām, mezgli parasti nav nepieciešami programmatūru veidošanā. Tāpēc daudzas modelēšanas sistēmas veido mezglus nerediģējamus vai pat neredzamus. Pēdējās NURBS programmatūras (piemēram, Autodesk Maya un Rhinoceros 3D) ļauj interaktīvi rediģēt mezglu pozīcijas.

### Secība

NURBS likņu secību definē kontrolpunktu numuri, kas ietekmē jebkuru doto punktu līknē. Līkne tiek reprezentēta matemātiski pēc pakāpes polinoma, kas ir par vienu vienību mazāks kā līknes kārtas numurs. Tādējādi, otra kārtas numura līkne (kas tiek reprezentēta ar lineāriem polinomiem), tiek saukta par lineāro līkni, trešā kārtas numura līkne tiek saukta par kvadrāta līkni un ceturtā par kubisko līkni. Kontrolpunktu skaitam jābūt lielākam vai vienādam ar līkņu skaitu. Praksē kubiskās līknes parasti tiek izmantotas visvairāk. Piektā un sestā kārtas numura līknes reizēm arī ir noderīgas, īpaši priekš augstākas pakāpes atvasinājuma iegūšanas, bet šīs līknes praktiski nekad netiek lietotas, jo tās rada iekšējas skaitliskas problēmas un izsauc neproporcionāli lielu kalkulēšana slaiku. 

### Pamatfunkciju konstruēšana

Bāzes funkcijas NURBS līknēm parasti apzīmē kā Ni, n(u), kur "i" nozīmē i — tās pakāpes kontrolpunktu, "n" atbilst bāzes funkcijas pakāpei. Parametru atkarība tiek lietota reti, tādēļ raksta Ni, n. Nulles pakāpes funkcija Ni, 0 ir konstanta funkcija. Tā ir viens attiecīgajā mezgla hordā un nulle visur citur. Ni, n ir lineāra Ni, n — 1 un Ni + 1, n — 1 interpolācija. Pēdējās divas funkcijas nav nulle n — 1 mezglu hordām, daļēji sakrītot ar n-2 mezglu hordām.

Funkcija Ni, n tiek rēķināta šādi:
Ni, n=fi, nNi,n — 1+gi+1, nNi+1, n — 1, kur fi pieaug lineāri no 0 līdz 1 intervālā, kur Ni,n — 1 nav 0, kamēr gi+1 samazinās no 1 līdz 0 intervālā, kur Ni+1, n — 1 nav 0. Ni, 1 ir trijstūra funkcija, kas nav 0 cauri divām mezglu hordām, vispirms pieaugot no 0 līdz 1, un samazinoties līdz 0 uz otrā mezgla hordas. 
Ja "u" ir parametrs un ki ir i — tās pakāpes mezgls, "f" un "g" funkcijas ir:

```
   f i,n(u)=u-ki/ki+n-ki
```

```
   g i,n(u)=ki+n-u/ki+n-ki
```

Funkcijas "f" un "g" ir pozitīvas, kad attiecīgā zemākās kārtas funkcija nav nulle. Izriet, kas bāzes funkcija ir pozitīva pie visām "n" un "u" vērtībām. Tas rada stabilu skaitlisko bāzes funkcijas aprēķinu. 
Var paredzēt, ka bāzes funkciju summa specifiskām parametru vērtībām ir viens - "partition of unity".

Viena mezgla horda ir ievērojami īsāka kā citas. Uz šīs mezgla hordas kvadrātiskā bāzes funkcijas virsotne ir atšķirīga — tā sasniedz gan drīz 1. savukārt blakus esošas bāzes funkcijas nokrīt līdz 0 daudz ātrāk. Ģeometriskā interpolācijā tas nozīmē, ka līkne tuvosies attiecīgajam punktam. Dubultā mezgla gadījumā mezgla hordas garums ir 0 un virsotne ir 1. Bāzes funkcija vairs nebūs atšķirīga šajā punktā. Ja blakus esošie kontrolpunkti nav kolineāri, līknei būs ass stūris.

Lineārā bāzes funkcija 
Kvadrātiskā bāzes funkcija

Manipulēšana ar NURBS objektiem
-------------------------------

NURBS objektiem iespējams piemērot daudzveidīgas manipulācijas. Piemēram, ja kāda līkne ir definēta izmantojot konkrētu pakāpi, un N kontroles punktus, to ir iespējams izteikt izmantojot to pašu pakāpi un N + 1 skaitu kontrolpunktu. Tā rezultātā noteikts skaits kontrolpunktu izmaina novietojumu un mezgls tiek ievietots mezgla vektorā. Šīs manipulācijas plaši tiek izmantotas interaktīvajā dizainā. Pievienojot jaunu kontrolpunktu, līknes formai jāpaliek nemainīgai, tādējādi radot sākuma punktu turpmākām korekcijām. Daļa no iespējamām darbībām ir aplūkota zemāk :

Mezglu ievietošana : kā nosaka termins, mezglu ievietošana paredz jauna mezgla izveidošanu, jau esošā mezglu vektorā. Ja līknes pakāpe ir ‘’n’’, tad n-1 kontrolpunkti tiek aizvietoti ar ‘’n’’ skaitu jaunu punktu. Līknes forma šīs darbības rezultātā nemainās.

Mezgls var tikt pievienots vairākkārtīgi līdz tiek sasniegts maksimālais mezglu skaits. Dažkārt tiek veikta tā dēvētā mezglu bagātināšana(uzlabošana), tās rezultātu iespējams sasniegt izmantojot algoritmu, kas ir daudz efektīvāks par atkārtotu manuālu mezglu ievietošanu.

Mezglu noņemšana. Tā ir pretēja darbība mezglu pievienošanai. Mērķis ir noņemt mezglus un saistītos kontrolpunktus ar nolūku iegūt blīvāku (kompaktāku) attēlojumu. Acīmredzot to ne vienmēr ir iespējams panākt, nemainot objekta formu. Praksē tiek izmantota atkāpe no precizitātes, lai noteiktu vai mezglu ir pieļaujams noņemt. 

Mezglu noņemšana tiek lietota arī lai attīrītu darbu pēc aktīvas modelēšanas perioda, kura laikā kontrolpunkti var tikt ievietoti manuāli, kā arī pēc līknes pārvietošanas no cita attēla, kad tieša objekta pārnešana noved pie pārmērīgi liela kontrolpunktu skaita.

Pakāpes pacēlums. Jebkura noteiktas pakāpes līkne vienmēr var tikt izteikta ar citu NURBS līkni, kurai ir augstāka pakāpe. Tas bieži tiek izmantots kombinējot atsevišķas NURBS līknes, piemēram, apvienojot blakusesošas līknes vai radot jaunu NURBS virsmu. Šīs darbības rezultātā, atsevišķas līknes tiek pārveidotas līdz vienādai pakāpei, parasti līdz maksimālajai līkņu pakāpei.