三維投影

三維投影是將三維空間中的點映射到二維平面上的方法。由於目前絕大多數圖形數據的顯示方式仍是二維的，因此三維投影的應用相當廣泛，尤其是在電腦圖形學，工程學和工程製圖中。

## 分類

- 三維圖形平面投影
- 平行投影：投影中心與投影平面的距離是無限的，投影線相互平行
- 正投影（正交投影）：投影線垂直於投影平面
- 多視圖投影：物體的坐標面與投影面平行，正視圖、側視圖、俯視圖
- 軸測投影：物體的三個坐標面或坐標軸與投影面均不平行
- 正等軸測投影（正等測）：投影時三個坐標軸等比例縮放，投影面坐標軸夾角120°
- 正二軸測投影（正二測）：投影時兩個坐標軸等比例縮放，第三個坐標軸縮放比例不同
- 正三軸測投影（正三測）：投影時三個坐標軸縮放比例均不相等
- 斜投影：投影線不垂直於投影平面
- 斜等軸測投影（斜等測）
- 斜二軸測投影（斜二測）
- 斜三軸測投影（斜三測）
- 透視投影：投影中心與投影平面的距離是有限的
- 一點透視
- 兩點透視
- 三點透視

## 平行投影

平行投影是投影線相互平行的投影。若投影線垂直於投影面則稱正投影，若投影面傾斜於投影面則稱斜投影。

### 正交投影

正交投影是一系列用於顯示三維物體的輪廓、細節或精確測量結果的變換方法。通常又稱作截面圖、鳥瞰圖或立面圖。

當視平面的法向（即攝像機的朝向）平行於笛卡爾坐標系三根坐標軸中的一根，數學變換定義如下：

若使用一個平行於y軸（側視圖）的正交投影將三維點$a_x$, $a_y$, $a_z$投影到二維平面上得到二維點$b_x$, $b_y$，可以使用如下公式

$$b_x = s_x a_x + c_x$$

$$b_y = s_z a_z + c_z$$

其中向量s是一個任意的縮放因子，而c是一個任意的偏移量。這些常量可自由選擇，通常用於將視口調整到一個合適的位置。該投影變換同樣可以使用矩陣表示（為清晰起見引入臨時向量d）

$$<pre> \begin{bmatrix} {d_x } \\ {d_y } \\ \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ </pre> \end{bmatrix}\begin{bmatrix} <pre> {a_x } \\ {a_y } \\ {a_z } \\ </pre> \end{bmatrix}$$

$$<pre> \begin{bmatrix} {b_x } \\ {b_y } \\ </pre> \end{bmatrix} = \begin{bmatrix} <pre> {s_x } & 0 \\ 0 & {s_z } \\ </pre> \end{bmatrix}\begin{bmatrix} <pre> {d_x } \\ {d_y } \\ </pre> \end{bmatrix} + \begin{bmatrix} <pre> {c_x } \\ {c_z } \\ </pre> \end{bmatrix}.$$

雖然正交投影產生的圖像在一定程度上反映了物體的三維特性，但此類投影圖像和實際觀測到的並不相同。特別是對於相同長度的平行線段，無論離虛擬觀察者（攝像機）遠近與否，它們都會在正交投影中顯示為相同長度。這會導致較近的線段看起來被縮短了。

### 斜投影

斜投影不像正交投影一樣投影線垂直於投影面，而是投影線與投影面成非90度的斜角。

## 透視投影

透視投影的定義更為複雜。可以將其理解為透過攝像機取景器對於被投影物體進行觀察。攝像機的位置、朝向和視野都將影響投影變換的結果。我們定義以下變量來對這一變換進行描述：

- $\mathbf{a}_{x,y,z}$：將被投影的三維空間中的點。
- $\mathbf{c}_{x,y,z}$：攝像機的位置。
- $\mathbf{\theta}_{x,y,z}$：攝像機的旋轉角度。當 $\mathbf{c}_{x,y,z}$=且 $\mathbf{\theta}_{x,y,z}$=, 三維向量將被投影到二維向量。
- $\mathbf{e}_{x,y,z}$：觀測者相對顯示平面的位置。

最終結果為：

- $\mathbf{b}_{x,y}$：$\mathbf{a}$所產生的二維投影。

首先我們定義點$\mathbf{d}_{x,y,z}$作為點$\mathbf{a}$向攝像機坐標系所作的變換，其中攝像機坐標係由攝像機的位置$\mathbf{c}$和旋轉$\mathbf{\theta}_{x,y,z}$所決定。該過程為：先用$\mathbf{a}$減去$\mathbf{c}$，然後使用由$-\mathbf{\theta}$產生的旋轉矩陣乘上該結果。該變換通常稱為攝像機變換(注意該計算過程假設使用左手法則)：

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

或者使用以下這種非矩陣表示的形式，其中角度的正負號與矩陣表示形式不同：

$$\begin{array}{lcl} <pre> d_x &= &\cos \theta_y\cdot(\sin \theta_z\cdot(a_y-c_y)+\cos \theta_z\cdot(a_x-c_x))-\sin \theta_y\cdot(a_z-c_z) \\ d_y &= &\sin \theta_x\cdot(\cos \theta_y\cdot(a_z-c_z)+\sin \theta_y\cdot(\sin \theta_z\cdot(a_y-c_y)+\cos \theta_z\cdot(a_x-c_x)))+\cos \theta_x\cdot(\cos \theta_z\cdot(a_y-c_y)-\sin \theta_z\cdot(a_x-c_x)) \\ d_z &= &\cos \theta_x\cdot(\cos \theta_y\cdot(a_z-c_z)+\sin \theta_y\cdot(\sin \theta_z\cdot(a_y-c_y)+\cos \theta_z\cdot(a_x-c_x)))-\sin \theta_x\cdot(\cos \theta_z\cdot(a_y-c_y)-\sin \theta_z\cdot(a_x-c_x)) \\ </pre> \end{array}$$

然後將變換後的該點通過以下方程投影到二維平面（此處投影平面為x/y平面，有時也使用x/z）:

$$\begin{array}{lcl} <pre> \mathbf{b}_x &= &(\mathbf{d}_x - \mathbf{e}_x) (\mathbf{e}_z / \mathbf{d}_z) \\ \mathbf{b}_y &= &(\mathbf{d}_y - \mathbf{e}_y) (\mathbf{e}_z / \mathbf{d}_z) \\ </pre> \end{array}$$

或在齊次坐標系下可以表示為：

$$\begin{bmatrix} <pre> \mathbf{f}_x \\ \mathbf{f}_y \\ \mathbf{f}_z \\ \mathbf{f}_w \\ </pre> \end{bmatrix}=\begin{bmatrix} <pre> 1 & 0 & 0 & -\mathbf{e}_x \\ 0 & 1 & 0 & -\mathbf{e}_y \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 1/\mathbf{e}_z & 0 \\ </pre> \end{bmatrix}\begin{bmatrix} <pre> \mathbf{d}_x \\ \mathbf{d}_y \\ \mathbf{d}_z \\ 1 \\ </pre> \end{bmatrix}$$

和

$$\begin{array}{lcl} <pre> \mathbf{b}_x &= &\mathbf{f}_x / \mathbf{f}_w \\ \mathbf{b}_y &= &\mathbf{f}_y / \mathbf{f}_w \\ </pre> \end{array}$$

觀測者到顯示平面的距離，$\mathbf{e}_z$，直接關係到視野的大小。$\alpha=2 \cdot \tan^{-1}(1/\mathbf{e}_z)$為可視角度。（這裡假設螢幕的兩角為(-1,-1)和(1,1)）

如果要在一些特定的顯示設備上顯示該二維平面，之後還要進行一些必要的剪裁和縮放操作。

## 圖示

<image>

計算三維空間中位於Ax，Az的點在螢幕坐標x軸的位置：

$$screen\ x\ coordinate\ (Bx)\ =\ model\ x\ coordinate\ (Ax) \times \frac{distance\ from\ eye\ to\ screen\ (Bz)}{distance\ from\ eye\ to\ point\ (Az)}$$

對於y軸同樣有:

$$screen\ y\ coordinate\ (By)\ =\ model\ y\ coordinate\ (Ay) \times \frac{distance\ from\ eye\ to\ screen\ (Bz)}{distance\ from\ eye\ to\ point\ (Az)}$$

(其中Ax和Ay是透視轉換前物體在空間中的坐標)