3D投影

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

## 分類

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

 

## 平行投影

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

### 正交投影

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

當視平面的法向（即攝像機的朝向）平行於笛卡爾坐標系三根坐標軸中的一根，數學變換定義如下：
若使用一個平行於 y 軸（側視圖）的正交投影將 3D 點 $a_{x}$ , $a_{y}$ , $a_{z}$ 投影到 2D 平面上得到 2D 點 $b_{x}$ , $b_{y}$ ，可以使用如下公式

　
: $b_{x}=s_{x}a_{x}+c_{x}$

　
: $b_{y}=s_{z}a_{z}+c_{z}$

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

　
: ${\begin{bmatrix}{d_{x}}\\{d_{y}}\\\end{bmatrix}}={\begin{bmatrix}1&0&0\\0&0&1\\\end{bmatrix}}{\begin{bmatrix}{a_{x}}\\{a_{y}}\\{a_{z}}\\\end{bmatrix}}$

　
: ${\begin{bmatrix}{b_{x}}\\{b_{y}}\\\end{bmatrix}}={\begin{bmatrix}{s_{x}}&0\\0&{s_{z}}\\\end{bmatrix}}{\begin{bmatrix}{d_{x}}\\{d_{y}}\\\end{bmatrix}}+{\begin{bmatrix}{c_{x}}\\{c_{z}}\\\end{bmatrix}}.$

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

### 斜投影

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

## 透視投影

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

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

最終結果為：

 * $\mathbf {b} _{x,y}$ ： $\mathbf {a} $ 所產生的 2D 投影。

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

　
: ${\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)$

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

　
: ${\begin{array}{lcl}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}))\\\end{array}}$

然後將變換後的該點通過以下方程投影到 2D 平面（此處投影平面為 _x/y_ 平面，有時也使用 _x/z_）:

　
: ${\begin{array}{lcl}\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})\\\end{array}}$

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

　
: ${\begin{bmatrix}\mathbf {f} _{x}\\\mathbf {f} _{y}\\\mathbf {f} _{z}\\\mathbf {f} _{w}\\\end{bmatrix}}={\begin{bmatrix}1&0&0&-\mathbf {e} _{x}\\0&1&0&-\mathbf {e} _{y}\\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}}$

和

　
: ${\begin{array}{lcl}\mathbf {b} _{x}&=&\mathbf {f} _{x}/\mathbf {f} _{w}\\\mathbf {b} _{y}&=&\mathbf {f} _{y}/\mathbf {f} _{w}\\\end{array}}$

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

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

## 圖示

計算 3D 空間中位於 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 是透視轉換前物體在空間中的坐標)

## 參看

* 計算機圖形學
  * 3D 計算機圖形
* 透視
* 單應性
* 3D 投影的數學理論：投影

## 參考文獻

## 深入閱讀

* Kenneth C. Finney. 3D Game Programming All in One. Thomson Course. 2004: 93 [2009-12-23]. ISBN 159200136X. （原始內容存檔於 2012-11-12）.