得鹿梦鱼 得鹿梦鱼

1 处理三维结构

在计算机图形学中表示一个物体的最普通的方法是多边形网格模型;

多边形网格模型是由一个顶点结构组成,每一个顶点是一个在所谓世界坐标空间中的三维的点。

计算机图形中的三维仿射变换

仿射变换可以用一个矩阵来表示。可以将一组仿射变换结合成一个总的仿射变换,

世界坐标系中定义物体,这个坐标通常是右手系,右手系是标准的数学规范,而左手系已经和正在被用于计算机图形学中特定的视图系统中。

在物体自身所处的局部坐标系中定义物体有时是很方便的,当一个三维物体被建模后,以物体中的某些参考点建立顶点坐标系是有用的,事实上,一个复杂的物体可能有多个局部坐标系,每一个局部坐标系用于其某个部分,这样,同一个物体可能会在一个场景中出现多次,而用一个局部的原点进行电仪是唯一合理的解决办法。于是通过一组平移、旋转和缩放变换的组合来描述物体。就可以看做是哦对每一个物体的局部坐标系向时间坐标系的变换,最后,当物体进行旋转时,如果相对于一个局部参考点来定义旋转会更容易些

属于一个物体的顶点集或者三维点集可以通过一个线性变换来变换到另一个点集,这2个点集处于同一个坐标系,计算机图形学中的矩阵表示法用了描述变换,在计算机图形学中的常规做法是将点或者向量用列矩阵表示,并放在变换矩阵T后面。

使用矩阵表示法,一个点V经平移、缩放、旋转变换表示为

V=V+D D平移矩阵V=SV S缩放矩阵V=RV R旋转矩阵\bold{V'} = \bold{V} + \bold{D} \text{ D平移矩阵} \\\bold{V'} = \bold{S}\bold{V} \text{ S缩放矩阵}\\\bold{V'} = \bold{R}\bold{V} \text{ R旋转矩阵}\\

在动画中,一个刚体只能被平移和旋转,而缩放用于物体的建模。为了将上述变换用同样的方式进行处理和组合,我们采用一种称为齐次坐标的坐标系,这个坐标系增加了空间的维数。

在齐次坐标系中,顶点x,y,zx,y,z被表示为wX,wY,wZ,ww \cdot X, w \cdot Y,w \cdot Z, w

对于任何缩放因子w0w\ne0,三维笛卡尔坐标表示为

x=X/wy=Y/wz=Z/wx = X/w \\y = Y/w \\z = Z/w

w=1w=1,则

[xyz1]\begin{bmatrix}x \\y \\z \\1\end{bmatrix}

平移矩阵V=TV\bold{V'}=\bold{TV}

$$
\begin{bmatrix}
x' \
y' \
z' \
1
\end

\begin{bmatrix}
1 & 0 & 0 & T_x \
0 & 1 & 0 & T_y \
0 & 0 & 1 & T_z \
0 & 0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
x \
y \
z \
1
\end{bmatrix}
$$

转换为方程组为

$$
\begin{cases}
x' = x + T_x \
y' = y + T_y \
z' = z + T_z
\end{cases}

$$

缩放矩阵为V=SV\bold{V'}='\bold{SV}

S=[Sx0000Sy0000Sz00001]\bold{S} = \begin{bmatrix}S_x & 0 & 0 & 0 \\0& S_y & 0 & 0 \\0& 0 & S_z & 0 \\0& 0 & 0 & 1 \end{bmatrix}

{x=xSxy=ySyz=zSz\begin{cases}x' = x \cdot S_x \\y' = y \cdot S_y \\z' = z \cdot S_z \end{cases}

旋转矩阵为V=RV\bold{V'}=\bold{RV}

关于xx轴旋转

Rx=[10001cosθsinθ01sinθcosθ00001]\bold{R_x} = \begin{bmatrix}1 & 0 & 0 & 0 \\1 & \cos\theta & -\sin\theta & 0 \\1 & \sin\theta & \cos\theta & 0 \\0 & 0 & 0 & 1\end{bmatrix}

关于yy轴旋转

Ry=[cosθ0sinθ00100sinθ0cosθ00001]\bold{R_y}=\begin{bmatrix}\cos\theta & 0 & \sin\theta & 0 \\0 & 1 & 0 & 0 \\-\sin\theta & 0 & \cos\theta & 0 \\0 & 0 & 0 & 1\end{bmatrix}

关于zz轴旋转

Rz=[cosθsinθ00sinθcosθ0000100001]\bold{R_z}=\begin{bmatrix}\cos\theta & -\sin\theta & 0 & 0 \\\sin\theta & \cos\theta & 0 & 0 \\0 & 0 & 1 & 0 \\0 & 0 & 0 & 1\end{bmatrix}

改变坐标系的变换

上述讨论了对于点的变换。所有的这些点都是相对于一个特定的坐标系来表示的。这个坐标系我们称为世界坐标系。而在计算机图形学中的许多场合,需要导出从一个坐标系到另一个坐标系的变换,最普遍的情况而言,我们有一些物体,而每一个物体都用物体自身的坐标系中的一组顶点来定义。这种坐标系称之为局部坐标系。每一个物体都有一个适宜的局部坐标系。

将一个带有局部坐标系的物体放到世界坐标系中一个位置的变换称为模型变换

将世界坐标系向观察坐标系的变换称为观察变换

我们通常通过对原点和坐标轴的变换来实现坐标系之间的变换。

结构变形变换

Sx,Sy,SzS_x,S_y,S_z用不同的值,则物体在特定的坐标轴方向上伸长或者缩短。

{X=FxxY=FyyZ=Fzz\begin{cases}X = F_xx \\Y = F_yy \\Z = F_zz\end{cases}

全局轴扭曲变换可以按一种微分旋转来实现,沿zz轴扭曲一个物体可以使用

{X=xcosθysinθY=xsinθ+ycosθZ=z\begin{cases}\bold{X} = x\cos\theta - y\sin\theta \\\bold{Y} = x\sin\theta + y\cos\theta \\\bold{Z} = z\end{cases}

θ=fz定义了沿z轴单位长度上的扭曲率\theta = f'z \text{定义了沿z轴单位长度上的扭曲率}

沿着一个轴进行全局线性弯曲是结合2个区域的一中合成变换。这2个区域包括一个弯曲区域和一个弯曲区域之外的区域。其中变形为旋转变换和平移变换

Barr将一个沿y轴的弯区域定义为yminyymaxy_{min} \le y \leq y_{max}

弯曲的曲率半径为1k\frac{1}{k},弯曲的中心位于y=y0y = y_0,弯曲的角度为θ=kyy0\theta = ky' - y_0

y={yminyymaxy' = \begin{cases}y_{min} \\y \\y_max\end{cases}

3 向量和计算机图形学

在计算机图形学中的许多地方都能用到向量,向量是一种实体。它具有大小和方向

向量的加法

向量V\bold{V}和向量W\bold{W}的加法定义为X=V+W=v1+w1,v2+w2,v3+w3\bold{X}=\bold{V}+\bold{W}=v_1+w_1,v_2+w_2,v_3+w_3

向量的长度

V=v12+v22+v32\bold{V}=\sqrtv_1^2+v_2^2+v_3^2

法向量和叉积

在计算机图形学中,相当大量的处理计算都是用表面法向量来进行的,例如在多边形网格模型中,在将表面和光线的方向进行比较时,用法向量来代表表面的方向。在反射模型中。用这样的比较来计算从表面反射出来的光的强度,光线方向向量与表面法向量之间的夹角越小。则从表面反射出来的反射光光强越大。

一个多边形的法向量是通过3个非共线的多边形顶点计算出来的。三个顶点定义了2个向量V\vec{V}W\vec{W},通过取这2个向量的叉积求出此多边形的法向量Np=V×W=v2w3v3w2i+v3w1v1w3j+v1w2v2w1k\bold{N_p}=\bold{V} \times \bold{W}=v_2w_3-v_3w_2\bold{i} + v_3w_1-v_1w_3\bold{j} + v_1w_2-v_2w_1\bold{k}

i=1,0,0j=0,1,0k=0,0,1\bold{i} = 1,0,0 \\\bold{j} = 0,1,0 \\\bold{k} = 0,0,1

法向量和点积

在计算机图形中,点积最通常的用法是提供2个向量之间的夹角的测量。2个向量之一是一个或者一组表面的法向量。点积常用于明暗处理计算和可见性测试

向量V\vec{V}W\vec{W}的点积是一个标量XX定义为X=VW=v1w1+=v2w2+=v3w3=VWcosθX=\vec{V}\vec{W}=v_1w_1 + =v_2w_2 + =v_3w_3=\vec{V}\vec{W}\cos\theta

计算机图形学中所利用的点积的性质是他的符号。

X>0锐角X=0直角X<0钝角X \gt 0 \text{锐角} \\X = 0 \text{直角} \\X \lt 0 \text{钝角}

与法向量反射相关的向量

有3个与表面法向量相关的重要向量,它们是光线方向向量L\vec{L},反射向量或镜像向量R\vec{R}以及观察向量V\vec{V},光线方向向量的方向由从表面法向量的尾部到光源之间的连线的方向给出。这个方向在简单明暗处理算法中定义为当前表面上的一点点。反射向量的方向是沿着光线向量方向射入进入再从表面反射出去的光的方向决定。几何光学告诉我们,入射角等于反射角

4 光线和计算机图形学

在计算机图形学中我们关注一种称为光线(ray)的实体。数学上称为有向线段。它具有位置大小和方向。大多数的情况下我们用其把光线描述为一种无限细的束。

相交

相交测试:观察一条光线是否与一个物体相交,如果是的话在何处相交

这里,我们为了计算相交而将一条光线与场景中所有的物体进行测试,这可能是一个代价非常高的计算。为了使这种计算更加有效。最通用的技术是将场景中的物体限制在一个限定体中。最合适的限定体是球。首先,测试光线是否与球相交。球包围这物体。如果光线与球不相交则他不会和物体相交。另一种的限定体是包围盒。

在进行逐个的多边形级别的详细的相交测试之前,首先将那些不可能相碰撞的物体挑选出来。检查球与球之间的相交是繁琐的。而对于包围盒,如果包围盒是轴向对其的。则只需限定在x,y,zx,y,z方向上进行检查

光线和球

设光线的2端分别是x1,y1,z1x_1,y_1,z_1x2,y2,z2x_2,y_2,z_2

{x=x1+x2x1t=x1+ity=y1+y2y1t=y1+jtz=z1+z2z1t=z1+kt\begin{cases}x = x_1 + x_2 - x_1t = x_1 + it \\y = y_1 + y_2 - y_1t = y_1 + jt \\z = z_1 + z_2 - z_1t = z_1 + kt \end{cases}

其中0t10 \le t \le 1

中心在(l,m,n)半径为R的球xl2+ym2+zn2=r2x - l^2 + y - m^2 + z - n^2 = r^2 => at2+bt+c=0at^2 + bt + c = 0

$$
a = i ^ 2 + j^2 + l^2 \
b = 2ix_1 -l + 2jy_1 -m + 2kz_1 - n \
c = l^2 + m^2 + n^2 + x_1^2 + y_1^2 + z_1^2 + 2-ix_1 -my_1 - nz_1 - r^2

$$

光线和凸多边形

如果物体由一组多边形表示并且是凸多边形。则直接的方法是逐个地对每一个多边形与光线的关系进行测试,步骤如下

  1. 得到一个包含多边形的平面方程‘

  2. 检查此平面与光线的相交

  3. 检查此相交是否包含在多边形中

光线和包围盒

光线和二次形

反射和折射

5 图像平面中的差值性质

双线性差值: 内部像素所需的各种性质都是通过对多边形顶点的性质内插获得的。