3D projekcija

**3D projekcija** ir metodes veids ar kādu trīs dimensionālie punkti tiek pārnesti uz divu dimensiju plakni. Tā kā lielākā daļa metožu ir balstīta uz pikseļu informāciju, kas tiek atainota bitu plaknēs, tā iegūstot divdimensionālu attēlu, tad šo projekcijas veidu plaši izmanto datorgrafikā, inženierijā un rasēšanā.

## Ortogrāfiskā projekcija
Kad cilvēka acis skatās uz ainu, objekti, kas atrodas tālāk, izskatās mazāki par objektiem, kas atrodas tuvāk. Ortogrāfiskā projekcija ignorē šo efektu, lai ļautu radīt zīmējumus, kas ir pēc mēroga, ko izmanto inženierijā.

Ortogrāfiskā projekcija izmanto mazu skaitu transformāciju, lai pārsvarā attēlotu no profila, daļu vai precīzus trīs dimensionāla objekta izmērus.

Ja plaknes skata normāle(kameras virziens) ir paralēls kādai no trīs asīm(x, y vai z asij), tad matemātiskā transformācija ir šāda: lai atainotu 3D punktus ax, ay, az uz 2D punktiem bx, by izmanto ortogrāfisko projekciju paralēlu y asij (profilskats), šāds vienādojums var tikt izmantots:
: 
b_x = s_x a_x + c_x

: 
b_y = s_z a_z + c_z

kur vektors **s** ir mērogs un **c** ir novietojuma izmaiņa. Šīs konstantes ir opcionālas un var tikt izmantotas, lai pareizi novietotu skata punktu(lauku, no kura tiek redzēts objekts). Izmantojot matricu reizināšanu, vienādojums ir sekojošs:
: 
 \begin{bmatrix}
   {b_x }  \\
   {b_y }  \\
\end{bmatrix} = \begin{bmatrix}
   {s_x } & 0 & 0 \\
   0 & 0 & {s_z }  \\
\end{bmatrix}\begin{bmatrix}
   {a_x }  \\
   {a_y }  \\
   {a_z }  \\
\end{bmatrix} + \begin{bmatrix}
   {c_x }  \\
   {c_z }  \\
\end{bmatrix}
.
Kamēr ortogrāfiski attēloti attēli ataino objekta trīsdimensionālo dabu, objekts netiek atainots skatā kā to uztver vienkārši uz to lūkojoties vai fotografējot. Respektīvi, mainoties objekta attālumam no skatu punkta, tā dimensionāli raksturlielumi nemainās. Rezultātā, objekta raksturlielumi netiek samazināti vai palielināti atkarībā no tā cik tuvu objekts atrodas no skatītāja/kameras kā tas būtu perspektīvajā projekcijā.

## Perspektīvā projekcija
Kad cilvēka acs aplūko ainu, objekti distancē izskatās mazāki kā objekti tuvumā — šī parādība ir zināma kā perspektīva. Kamēr ortogrāfiskā projekcija ignorē šo efektu, tādējādi ļaujot veikt precīzus mērījumus, tikmēr perspektīvā projekcija objektus attālumā ataino mazākus, tādējādi veidojot reālistisku skatu.

Perspektīvajai projekcijai ir nepieciešama daudz sarežģītāka definīcija salīdzinājumā ar ortogrāfisko projekciju. Lai konceptuāli saprastu šīs projekcijas uzbūvi ir jāiztēlojas 2D projekcija it kā objekts tiek skatīts caur kameras „skata meklētāju”(*angļu val.: viewfinder*). Kameras pozīcija, novietojums un skata lauks kontrolē projekcijas transformācijas raksturu. Sekojošie mainīgie definē šo transformāciju:
* \mathbf{a}_{x,y,z} — 3D pozīcija punktam A kas tiks projicēts.
* \mathbf{c}_{x,y,z} — 3D pozīcija punkta C kas būs kameras novietojuma punkts
* \mathbf{\theta}_{x,y,z} — Kameras novietojums
* \mathbf{e}_{x,y,z} — novērošanas pozīcija, kas ir relatīva attēlojuma virsmai, kas iet caur punktu C, kurš ir kameras punkts
Kas rezultējas:
* \mathbf{b}_{x,y} — **a** 2D projekcija
Kad \mathbf{c}_{x,y,z}=\langle 0,0,0\rangle, un \mathbf{\theta}_{x,y,z} = \langle 0,0,0\rangle, 3D vektors \langle 1,2,0 \rangle tiek projicēts kā 2D vektors \langle 1,2 \rangle.

Lai aprēķinātu \mathbf{b}_{x,y} vispirms tiek definēts vektors \mathbf{d}_{x,y,z} kā punkta A pozīcija koordinātu sistēmā, kas tiek definēta pēc kameras ar sakni C rotēta pēc \mathbf{\theta} pēc saistības ar sakuma koordinātu sistēmu. Tas tiek sasniegs atņemot **c** no **a** un tad pievienojot rotāciju -\mathbf{\theta} rezultātam. Šī transformācija tiek dēvēta par kameras transformāciju(*angļu val.: camera transform*) un var tikt atainota šādi: atainojot rotāciju attiecībā pret *x, y* un *z* asīm(šajos aprēķinos pieņem, ka asis ir sakārtotas pretēji labās rokas likumam).:

: 
\begin{bmatrix}
   \mathbf{d}_x \\
   \mathbf{d}_y \\
   \mathbf{d}_z \\
\end{bmatrix}=\begin{bmatrix}
   1 & 0 & 0  \\
   0 & {\cos ( \mathbf{- \theta}_x ) } & { - \sin ( \mathbf{- \theta}_x ) }  \\
   0 & { \sin ( \mathbf{- \theta}_x ) } & { \cos ( \mathbf{- \theta}_x ) }  \\
\end{bmatrix}\begin{bmatrix}
   { \cos ( \mathbf{- \theta}_y ) } & 0 & { \sin ( \mathbf{- \theta}_y ) }  \\
   0 & 1 & 0  \\
   { - \sin ( \mathbf{- \theta}_y ) } & 0 & { \cos ( \mathbf{- \theta}_y ) }  \\
\end{bmatrix}\begin{bmatrix}
   { \cos ( \mathbf{- \theta}_z ) } & { - \sin ( \mathbf{- \theta}_z ) } & 0  \\
   { \sin ( \mathbf{- \theta}_z ) } & { \cos ( \mathbf{- \theta}_z ) } & 0  \\
   0 & 0 & 1  \\
\end{bmatrix}\left( {\begin{bmatrix}
   \mathbf{a}_x  \\
   \mathbf{a}_y  \\
   \mathbf{a}_z  \\
\end{bmatrix} - \begin{bmatrix}
   \mathbf{c}_x  \\
   \mathbf{c}_y  \\
   \mathbf{c}_z  \\
\end{bmatrix}} \right)

Šāds attēlojums atbilst rotācijai par trim Eilera leņķiem(Euler angles), izmantojot xyz konvertāciju, kas var tikt interpretēta kā „rotācija ap *netipiskām* asīm (rotācija ap skatu) kārtībā *z, y, x* (lasot no labās uz kreiso)” vai „rotācija ap *patiesajām* asīm(kameras asis) secībā x, y, z (lasot no kreisās uz labo)”. Jāpievērš uzmanība tam, ka kamera netiek rotēta (\mathbf{\theta}_{x,y,z} = \langle 0,0,0\rangle), tad matricas atkrīt(kā identitādes) un tas savukārt atvieglo vienādojumu: \mathbf{d} = \mathbf{a} - \mathbf{c}.

Alternatīva matricu nelietošanai ir(aizvietojot (ax-cx) ar x, noīsinot cosθ par c un sinθ par s):
: 
\begin{array}{lcl}
	\mathbf{d}_x = c_y (s_z \mathbf{y}+c_z \mathbf{x})-s_y \mathbf{z} \\
	\mathbf{d}_y = s_x (c_y \mathbf{z}+s_y (s_z \mathbf{y}+c_z \mathbf{x}))+c_x (c_z \mathbf{y}-s_z \mathbf{x}) \\
	\mathbf{d}_z = c_x (c_y \mathbf{z}+s_y (s_z \mathbf{y}+c_z \mathbf{x}))-s_x (c_z \mathbf{y}-s_z \mathbf{x}) \\
\end{array}

Tagad šis transformētais punkts par tikt atainots 2D plaknē izmantojot formulu(šeit *x/y* ir izmantos kā projekcijas plakne, literatūrā var būt arī *x/z*)::
: 
\begin{array}{lcl}
 \mathbf{b}_x &= & \frac{\mathbf{e}_z}{\mathbf{d}_z} \mathbf{d}_x - \mathbf{e}_x \\
 \mathbf{b}_y &= & \frac{\mathbf{e}_z}{\mathbf{d}_z} \mathbf{d}_y - \mathbf{e}_y\\
\end{array}.

Vai matricas formā izmantojot homogēnas koordinātas, sistēma
: 
\begin{bmatrix}
   \mathbf{f}_x \\
   \mathbf{f}_y \\
   \mathbf{f}_z \\
   \mathbf{f}_w \\
\end{bmatrix}=\begin{bmatrix}
   1 & 0 & -\frac{\mathbf{e}_x}{\mathbf{e}_z} & 0 \\
   0 & 1 & -\frac{\mathbf{e}_y}{\mathbf{e}_z} & 0 \\
   0 & 0 & 1 & 0 \\
   0 & 0 & 1/\mathbf{e}_z & 0 \\
\end{bmatrix}\begin{bmatrix}
   \mathbf{d}_x  \\
   \mathbf{d}_y  \\
   \mathbf{d}_z  \\
   1 \\
\end{bmatrix}

saistībā ar argumentiem izmanto līdzīgus trijstūrus, tas noved pie homogēnas koordinātes, dodot:
: 
\begin{array}{lcl}
 \mathbf{b}_x &= &\mathbf{f}_x / \mathbf{f}_w \\
 \mathbf{b}_y &= &\mathbf{f}_y / \mathbf{f}_w \\
\end{array}.

Attālums no skatītāja un redzamās virsmas, \mathbf{e}_z, ir tieši saistīs ar redzes lauku, kur \alpha=2 \cdot \tan^{-1}(1/\mathbf{e}_z) ir redzes leņķis. (Piezīme: tiek pieņems, ka tiek punkti (-1,-1) un (1,1) tiek uzstādīti aplūkojamās virsmas stūros).

Vienādojums var tikt pierakstīts šādi:
: 
\begin{array}{lcl}
 \mathbf{b}_x= (\mathbf{d}_x \mathbf{s}_x ) / (\mathbf{d}_z \mathbf{r}_x) \mathbf{r}_z\\
 \mathbf{b}_y= (\mathbf{d}_y \mathbf{s}_y ) / (\mathbf{d}_z \mathbf{r}_y) \mathbf{r}_z\\
\end{array}.

Kur \mathbf{s}_{x,y} ir ekrāna izmērs, \mathbf{r}_{x,y} ierakstāmās virsmas izmērs, \mathbf{r}_z ir attālums no ierakstāmās virsmas līdz kameras centram un \mathbf{d}_z ir attālums no 3D objekta punkta, kas tiek attēlots, līdz kameras centram.

Tālākas apgriešanas un mērogojamības operācijas var būt nepieciešamas lai iestādītu 2D plakni uz konkrētā ekrāna.

## Diagramma
Attēls:Perspective_transform_diagram.svg

Lai noteiktu, kura ekrāna x koordināta ir saistīta ar punktu pie A_x,A_z jāreizina punkta koordinātes:
: B_x = A_x \frac{B_z}{A_z}
kur
: B_x ir ekrāna x koordināte
: A_x ir modeļa x koordināte
: B_z ir fokālais garums — aksiālais attālums no kameras centra līdz monitoram
: A_z attālums līdz objektam.
Tā kā kamera ir 3D vidē, tad tas pats ir attiecināms uz y koordinātu, aizvietojot x ar y augstāk redzamajā diagrammā un vienādībā.

## Atsauces