计算机图形学.李胜.05.投影(1)
三维图形的基本问题
- 在二维屏幕上显示三维物体
- 投影
- 三维形体的表示
- 各种用于形体表示的理论、模型、方法
- 反映遮挡关系
- 消除隐藏面与隐藏线
- 产生真实感图形
- 建立光照明模型、开发真实感图形绘制方法
平面几何投影
- 投影
- 将 n 维的店变换成小于 n 维的点
- 3 => 2
- 投影中心
- COP:Center Of Projection
- 视觉系统:观察点、视点
- 电影放映机:光源
- 投影平面
- 又称为观察平面 VP(View Plane)
- 不经过投影中心
- 平面(照相机底片),曲面(球幕电影、视网膜)
- 投影线
- 从投影中心向物体上各点发出的射线
- 直线:光线
- 曲线:光线跟踪
- 平面几何投影
- 投影面为平面
- 投影线为直线
- 包括透视投影和平行投影
- 透视投影:投影中心与投影平面之间的距离有限
- 平行投影:投影中心与投影平面之间的距离无限
- 透视投影
- 灭点:不平行于投影平面的平行线,经过透视投影之后收敛于一点,称为灭点
- 主灭点:平行于坐标轴的平行线的灭点
- 按照主灭点个数分类
- 一点透视:投影平面平行于 xOy 平面
- 两点透视:投影平面平行于 y 轴,与 x、z 轴都有交点
- 三点透视:投影平面与 x、y、z 轴都有交点
- 产生近大远小的视觉效果,由它产生的图形深度感强,看起来更加真实
- 《最后的晚餐》:只有一个主灭点,耶稣的头部
- 平行投影
- 正投影与斜投影
- 正投影:投影方向垂直于投影平面
- 斜投影:投影方向不垂直投影平面
- 三视图
- 正视图、侧视图、俯视图
- 不能无误的重现原模型
观察坐标系中的投影变换
观察坐标系:
- VRC:View Reference Coordinate
- 照相机所在坐标系
建立观察坐标系
坐标原点:VRP(View Reference Point)
- 聚焦参考点与投影平面上的投影
n 轴
- 照相机的镜头方向(投影平面的法向)
v 轴
- 照相机向上的方向(观察正向 VUP 在投影平面的投影)
u 轴
\(u=v\times n\)
叉乘转化为矩阵
\(\vec{a}\times\vec{b}=(a_2b_3-b_2a_3,a_3b_1-b_3a_1,a_1b_2-b_1a_2)\)
- \((a_1\vec{i}+a_2\vec{j}+a_3\vec{k})\times(b_1\vec{i}+b_2\vec{j}+b_3\vec{k})\) 展开即可
\[ \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} \begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} \]
\((u,v,n)\)
投影平面:\(n=0\)
投影中心:\((0,0,d)\)
视见体:三维裁剪窗口
- 6 个裁剪面
投影参考点:PRP(Projection Reference Point)
- 透视投影:COP = PRP
- 平行投影:投影方向(DOP)= 窗口中心 CW 和 PRP 的连线
投影参数表
参数 | 作用 |
---|---|
投影类型 | 定义投影是平行投影还是透视投影 |
观察参考点 \(VRP\) | 在世界坐标系中指定,为观察坐标系原点 |
观察平面法向 \(VPN\) | 在世界坐标系中指定,为观察坐标的 \(n\) 轴 |
观察正向 \(VUP\) | 在世界坐标系中指定,确定观察坐标系的 \(v\) 轴 |
投影参考点 \(PRP\) | 在观察坐标系中指定确定投影中心或投影方向 |
前裁剪面裁距 \(F\) | 在观察坐标系中指定,\(n=F\) 为前裁剪面 |
后裁剪面裁距 \(B\) | 在观察坐标系中指定,\(n=B\) 为后裁剪面 |
窗口 \(u_{min},u_{max},v_{min},v_{max}\) | 在观察坐标系的uv平面上指定,确定窗口与视见体 |
- 窗口不一定关于原点对称
三维空间直线参数方程
- 过顶点 \(A(x_0,y_0,z_0)\),方向向量 \((m,n,p)\),直线参数方程如下
\[ \left\{ \begin{array}{**lr**} x=t(m-x_0)+x_0\\ y=t(n-y_0)+y_0\\ z=t(p-z_0)+z_0 \end{array} \right.or \left\{ \begin{array}{**lr**} x=tm+x_0\\ y=tn+y_0\\ z=tp+z_0 \end{array} \right. \]
透视投影变换求解
投影中心\((0,0,d)\),待投影点 \(P(u_p,v_p,n_p)\),求解在投影平面 \(n=0\) 的投影点 \(Q(u_q,v_q,n_q)\)
投影线的参数方程(经过投影中心\((0,0,d)\)) \[ \left\{ \begin{array}{**lr**} u=tu_p & \\ v=tv_p & t\ge 0\\ n=t(n_p-d)+d & \end{array} \right. \]
求解,令 \(n=0\)
\[ \left\{ \begin{array}{**lr**} u_q=\dfrac{u_p}{1-\dfrac{n_p}{d}} \\ v_q=\dfrac{v_p}{1-\dfrac{n_p}{d}} \\ n_q=0 \end{array} \right. \]
- 将其写作矩阵形式 \(Q=M_{per}P\)
- 注意得到的结果需要进行标准化 \(h\ne 1\)
\[ \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & -\dfrac{1}{d} &1\\ \end{bmatrix} \]
平行投影变换求解
- 投影平面 \(n=0\),投影方向 \((0,0,-1)\),待投影点为 \(P(u_p,v_p,n_p)\),求投影点 \(Q(u_q,v_q,n_q)\)
- \(Q(u_p,v_p,0)\)
- 将其写作矩阵形式 \(Q=M_{ori}P\)
\[ \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \]
- \(\lim_\limits{d\to\infty}M_{per}=M_{ori}\)
世界坐标系WC到观察坐标系VRC的变换
- 条件
- WC:xyz,VRC:uvn
- VRC 的坐标原点 VRP \((VRP_x,VRP_y,VRP_z)\)
- 投影平面法向 \(\vec{VPN}\)
- 观察正向 \(\vec{VUP}\)
- 做如下记号
\[ \left\{ \begin{array}{**lr**} \vec{n}=\dfrac{\vec{VPN}}{|\vec{VPN}|}=[n_x,n_y,n_z]\\ \vec{u}=\dfrac{\vec{VUP}\times\vec{VPN}}{|\vec{VUP}\times\vec{VPN}|}=[u_x,u_y,u_z] \\ \vec{v}=\vec{n}\times\vec{u} \end{array} \right. \]
- 先平移后旋转
\[ M_{WC\to VRC}= \begin{bmatrix} u_x & u_y & u_z & 0\\ v_x & v_y & v_z & 0\\ n_x & n_y & n_z & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -VRP_x\\ 0 & 1 & 0 & -VRP_y\\ 0 & 0 & 1 & -VRP_z\\ 0 & 0 & 0 & 1\\ \end{bmatrix} =RT \]
证明1:直接通过线性代数的知识,两个空间的正交变换为 \(R\)
- 直接验证结果也是显然正确的
证明2:参考《计算机图形学 倪眀田 吴良芝》P143-145
平移变换显然,我们只考虑两个坐标系的原点相同旋转部分
通过解构的方法证明
步骤如下
绕 x 轴旋转角度 \(\theta_x\) 使得 n 轴落于 xOz 平面 \[ \cos\theta_x=\dfrac{n_z}{\sqrt{n_y^2+n_z^2}},\qquad \sin\theta_x=\dfrac{n_y}{\sqrt{n_y^2+n_z^2}} \]
绕 y 轴旋转角度 \(\theta_y\) 使得 n 轴和 z 轴同向且重合 \[ \cos\theta_y=\sqrt{n_y^2+n_z^2},\qquad \sin\theta_y=n_x \]
绕 z 轴旋转角度 \(\theta_z\) 使得 u 轴和 x 轴同向且重合
这一部分比较麻烦,可以先用上面的变换得到在世界坐标系中单位向量对应的点 \(\vec{u}\) 的位置
注意有
- \(\vec{u}\cdot\vec{n}=u_xn_x+u_yn_y+u_zn_z=0\)
- \(\vec{n}\times\vec{u}=(n_yu_z-u_yn_z,n_zu_x-u_zn_x,n_xu_y-u_xn_y)=(v_x,v_y,v_z)\)
\[ R_y(\theta_y)= \begin{bmatrix} \sqrt{n_y^2+n_z^2} & 0 & -n_x & 0\\ 0 & 1 & 0 & 0\\ n_x & 0 & \sqrt{n_y^2+n_z^2} & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix}\\ \]
\[ R_x(\theta_x)= \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & \dfrac{n_z}{\sqrt{n_y^2+n_z^2}} & -\dfrac{n_y}{\sqrt{n_y^2+n_z^2}} & 0\\ 0 & \dfrac{n_y}{\sqrt{n_y^2+n_z^2}} & \dfrac{n_z}{\sqrt{n_y^2+n_z^2}} & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix}\\ \]
\[ R_y(\theta_y)R_x(\theta_x)= \begin{bmatrix} \sqrt{n_y^2+n_z^2} & -\dfrac{n_xn_y}{\sqrt{n_y^2+n_z^2}} & -\dfrac{n_xn_z}{\sqrt{n_y^2+n_z^2}} & 0\\ 0 & \dfrac{n_z}{\sqrt{n_y^2+n_z^2}} & -\dfrac{n_y}{\sqrt{n_y^2+n_z^2}} & 0\\ n_x & n_y & n_z & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \]
\[ \vec{u}=R_y(\theta_y)R_x(\theta_x)\begin{bmatrix} u_x\\ u_y\\ u_z\\ 1 \end{bmatrix} = \begin{bmatrix} \dfrac{u_x}{\sqrt{n_y^2+n_z^2}}\\ \dfrac{u_yn_z-u_zn_y}{\sqrt{n_y^2+n_z^2}}\\ 0\\ 1\\ \end{bmatrix} \]
此时的 \(|\vec{u}|=1\),旋转不改变长度
- 那么同时就会有 \(u_x^2+v_x^2+n_x^2=1\)
或者直接计算
\[ \begin{aligned} &u_x^2+(u_yn_z-u_zn_y)^2 \\ =\ &u_x^2+v_x^2\\ & u_x^2+(u_yn_z-u_zn_y)^2 \\ =\ &u_x^2+u_y^2n_z^2+u_z^2n_y^2-2n_yu_yn_zu_z\\ =\ &u_x^2+u_y^2(1-n_x^2-n_y^2)+u_z^2(1-n_x^2-n_z^2)-2n_yu_yn_zu_z\\ =\ &1-u_y^2n_x^2-u_y^2n_y^2-u_z^2n_x^2-u_z^2n_z^2-2n_yu_yn_zu_z\\ =\ &1-u_y^2n_x^2-u_z^2n_x^2-(u_yn_y+u_zn_z)^2\\ =\ &1-u_y^2n_x^2-u_z^2n_x^2-(u_xn_x)^2\\ =\ &1-n_x^2\\ \end{aligned} \]
\(\Rightarrow u_x^2+v_x^2+n_x^2=1\)
此时可以推导出 \(\theta_z\)
\[ \cos(-\theta_z)=\dfrac{u_x}{\sqrt{n_y^2+n_z^2}} \]
\[ \sin(-\theta_z)=\dfrac{u_yn_z-u_zn_y}{\sqrt{n_y^2+n_z^2}} \]
\[ \cos(\theta_z)=\dfrac{u_x}{\sqrt{n_y^2+n_z^2}}=\dfrac{v_yn_z-n_yv_z}{\sqrt{n_y^2+n_z^2}} \]
\[ \sin(\theta_z)=-\dfrac{u_yn_z-u_zn_y}{\sqrt{n_y^2+n_z^2}}=\dfrac{v_x}{\sqrt{n_y^2+n_z^2}} \]
乘法时根据次数把 \(\sin\theta_x,\cos\theta_z\) 展开为不同形式 \[ R_z(\theta_z)= \begin{bmatrix} \cos\theta_z & -\sin\theta_z & 0 & 0\\ \sin\theta_z & \cos\theta_z & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix}\\ \]
\[ R_z(\theta_z)R_y(\theta_y)R_x(\theta_x)= \begin{bmatrix} u_x & u_y & u_z & 0\\ v_x & v_y & v_z & 0\\ n_x & n_y & n_z & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \]