三维投影

三维投影是将三维空间中的点映射到二维平面上的方法。由于目前绝大多数图形数据的显示方式仍是二维的，因此三维投影的应用相当广泛，尤其是在计算机图形学，工程学和工程制图中。 三维图形平面投影 平行投影：投影中心与投影平面的距离是无限的，投影线相互平行 正投影（正交投影）：投影线垂直于投影平面 多视图投影：物体的坐标面与投影面平行，正视图、侧视图、俯视图 轴测投影：物体的三个坐标面或坐标轴与投影面均不平行 正等轴测投影（正等测）：投影时三个坐标轴等比例缩放，投影面坐标轴夹角120° 正二轴测投影（正二测）：投影时两个坐标轴等比例缩放，第三个坐标轴缩放比例不同 正三轴测投影（正三测）：投影时三个坐标轴缩放比例均不相等 斜投影：投影线不垂直于投影平面 斜等轴测投影（斜等测） 斜二轴测投影（斜二测） 斜三轴测投影（斜三测） 透视投影：投影中心与投影平面的距离是有限的 一点透视 两点透视 三点透视 平行投影是投影线相互平行的投影。若投影线垂直于投影面则称正投影，若投影面倾斜于投影面则称斜投影。 正交投影是一系列用于显示三维物体的轮廓、细节或精确测量结果的变换方法。通常又称作截面图、鸟瞰图或立面图。 当视平面的法向（即摄像机的朝向）平行于笛卡尔坐标系三根坐标轴中的一根，数学变换定义如下： 若使用一个平行于y轴（侧视图）的正交投影将三维点 a x {\displaystyle a_{x}} , a y {\displaystyle a_{y}} , a z {\displaystyle a_{z}} 投影到二维平面上得到二维点 b x {\displaystyle b_{x}} , b y {\displaystyle b_{y}} ，可以使用如下公式 b x = s x a x + c x {\displaystyle b_{x}=s_{x}a_{x}+c_{x}} b y = s z a z + c z {\displaystyle b_{y}=s_{z}a_{z}+c_{z}} 其中向量s是一个任意的缩放因子，而c是一个任意的偏移量。这些常量可自由选择，通常用于将视口调整到一个合适的位置。该投影变换同样可以使用矩阵表示（为清晰起见引入临时向量d） [ d x d y ] = [ 1 0 0 0 0 1 ] [ a x a y a z ] {\displaystyle {\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}}} [ b x b y ] = [ s x 0 0 s z ] [ d x d y ] + [ c x c z ] . {\displaystyle {\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}}.} 虽然正交投影产生的图像在一定程度上反映了物体的三维特性，但此类投影图像和实际观测到的并不相同。特别是对于相同长度的平行线段，无论离虚拟观察者（摄像机）远近与否，它们都会在正交投影中显示为相同长度。这会导致较近的线段看起来被缩短了。 斜投影不像正交投影一样投影线垂直于投影面，而是投影线与投影面成非90度的斜角。 透视投影的定义更为复杂。可以将其理解为透过摄像机取景器对于被投影物体进行观察。摄像机的位置、朝向和视野都将影响投影变换的结果。我们定义以下变量来对这一变换进行描述： a x , y , z {\displaystyle \mathbf {a} _{x,y,z}} ：将被投影的三维空间中的点。 c x , y , z {\displaystyle \mathbf {c} _{x,y,z}} ：摄像机的位置。 θ x , y , z {\displaystyle \mathbf {\theta } _{x,y,z}} ：摄像机的旋转角度。当 c x , y , z {\displaystyle \mathbf {c} _{x,y,z}} =<0,0,0>且 θ x , y , z {\displaystyle \mathbf {\theta } _{x,y,z}} =<0,0,0>, 三维向量<1,2,0>将被投影到二维向量<1,2>。 e x , y , z {\displaystyle \mathbf {e} _{x,y,z}} ：观测者相对显示平面的位置。 最终结果为： b x , y {\displaystyle \mathbf {b} _{x,y}} ： a {\displaystyle \mathbf {a} } 所产生的二维投影。 首先我们定义点 d x , y , z {\displaystyle \mathbf {d} _{x,y,z}} 作为点 a {\displaystyle \mathbf {a} } 向摄像机坐标系所作的变换，其中摄像机坐标系由摄像机的位置 c {\displaystyle \mathbf {c} } 和旋转 θ x , y , z {\displaystyle \mathbf {\theta } _{x,y,z}} 所决定。该过程为：先用 a {\displaystyle \mathbf {a} } 减去 c {\displaystyle \mathbf {c} } ，然后使用由 − θ {\displaystyle -\mathbf {\theta } } 产生的旋转矩阵乘上该结果。该变换通常称为摄像机变换(注意该计算过程假设使用左手法则)： [ d x d y d z ] = [ 1 0 0 0 cos ⁡ ( − θ x ) − sin ⁡ ( − θ x ) 0 sin ⁡ ( − θ x ) cos ⁡ ( − θ x ) ] [ cos ⁡ ( − θ y ) 0 sin ⁡ ( − θ y ) 0 1 0 − sin ⁡ ( − θ y ) 0 cos ⁡ ( − θ y ) ] [ cos ⁡ ( − θ z ) − sin ⁡ ( − θ z ) 0 sin ⁡ ( − θ z ) cos ⁡ ( − θ z ) 0 0 0 1 ] ( [ a x a y a z ] − [ c x c y c z ] ) {\displaystyle {\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)} 或者使用以下这种非矩阵表示的形式，其中角度的正负号与矩阵表示形式不同： d x = cos ⁡ θ y ⋅ ( sin ⁡ θ z ⋅ ( a y − c y ) + cos ⁡ θ z ⋅ ( a x − c x ) ) − sin ⁡ θ y ⋅ ( a z − c z ) d y = sin ⁡ θ x ⋅ ( cos ⁡ θ y ⋅ ( a z − c z ) + sin ⁡ θ y ⋅ ( sin ⁡ θ z ⋅ ( a y − c y ) + cos ⁡ θ z ⋅ ( a x − c x ) ) ) + cos ⁡ θ x ⋅ ( cos ⁡ θ z ⋅ ( a y − c y ) − sin ⁡ θ z ⋅ ( a x − c x ) ) d z = cos ⁡ θ x ⋅ ( cos ⁡ θ y ⋅ ( a z − c z ) + sin ⁡ θ y ⋅ ( sin ⁡ θ z ⋅ ( a y − c y ) + cos ⁡ θ z ⋅ ( a x − c x ) ) ) − sin ⁡ θ x ⋅ ( cos ⁡ θ z ⋅ ( a y − c y ) − sin ⁡ θ z ⋅ ( a x − c x ) ) {\displaystyle {\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}}} 然后将变换后的该点通过以下方程投影到二维平面（此处投影平面为x/y平面，有时也使用x/z）: b x = ( d x − e x ) ( e z / d z ) b y = ( d y − e y ) ( e z / d z ) {\displaystyle {\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}}} 或在齐次坐标系下可以表示为： [ f x f y f z f w ] = [ 1 0 0 − e x 0 1 0 − e y 0 0 1 0 0 0 1 / e z 0 ] [ d x d y d z 1 ] {\displaystyle {\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}}} 和 b x = f x / f w b y = f y / f w {\displaystyle {\begin{array}{lcl}\mathbf {b} _{x}&=&\mathbf {f} _{x}/\mathbf {f} _{w}\\\mathbf {b} _{y}&=&\mathbf {f} _{y}/\mathbf {f} _{w}\\\end{array}}} 观测者到显示平面的距离， e z {\displaystyle \mathbf {e} _{z}} ，直接关系到视野的大小。 α = 2 ⋅ tan − 1 ⁡ ( 1 / e z ) {\displaystyle \alpha =2\cdot \tan ^{-1}(1/\mathbf {e} _{z})} 为可视角度。（这里假设屏幕的两角为(-1,-1)和(1,1)） 如果要在一些特定的显示设备上显示该二维平面，之后还要进行一些必要的剪裁和缩放操作。 计算三维空间中位于Ax，Az的点在屏幕坐标x轴的位置： s c r e e n   x   c o o r d i n a t e   ( B x )   =   m o d e l   x   c o o r d i n a t e   ( A x ) × d i s t a n c e   f r o m   e y e   t o   s c r e e n   ( B z ) d i s t a n c e   f r o m   e y e   t o   p o i n t   ( A z ) {\displaystyle screen\ x\ coordinate\ (Bx)\ =\ model\ x\ coordinate\ (Ax)\times {\frac {distance\ from\ eye\ to\ screen\ (Bz)}{distance\ from\ eye\ to\ point\ (Az)}}} 对于y轴同样有: s c r e e n   y   c o o r d i n a t e   ( B y )   =   m o d e l   y   c o o r d i n a t e   ( A y ) × d i s t a n c e   f r o m   e y e   t o   s c r e e n   ( B z ) d i s t a n c e   f r o m   e y e   t o   p o i n t   ( A z ) {\displaystyle screen\ y\ coordinate\ (By)\ =\ model\ y\ coordinate\ (Ay)\times {\frac {distance\ from\ eye\ to\ screen\ (Bz)}{distance\ from\ eye\ to\ point\ (Az)}}} (其中Ax和Ay是透视转换前物体在空间中的坐标) 计算机图形学 三维计算机图形 透视 单应性 三维投影的数学理论：投影 Ingrid Carlbom, Joseph Paciorek, Planar Geometric Projections and Viewing Transformations, ACM Computing Surveys, 1978, 10 (4): 465–502, doi:10.1145/356744.356750 . Riley, K F. Mathematical Methods for Physics and Engineering. Cambridge University Press. 2006: 931,942. ISBN 0521679710. doi:10.2277/0521679710.  Goldstein, Herbert. Classical Mechanics 2nd Edn.. Reading, Mass.: Addison-Wesley Pub. Co. 1980: 146–148. ISBN 0201029189.  Rotation About an Arbitrary Axis in 3 Dimensions （页面存档备份，存于互联网档案馆） Glenn Murray 2013-6-6 [2014-4-23] Sonka, M; Hlavac, V; Boyle, R, Image Processing, Analysis & Machine Vision 2nd Edn., Chapman and Hall: 14, 1995, ISBN 0412455706  维基共享资源上的相关多媒体资源：三维投影 Kenneth C. Finney. 3D Game Programming All in One. Thomson Course. 2004: 93 [2009-12-23]. ISBN 159200136X. （原始内容存档于2012-11-12）.