Fundamentals Of Computer Graphics 第二章 数学基础
这一章打了很多基础的数学铺垫,还是只把感兴趣的记下来吧。
$\mathrm{atan2}(y,x)$:和普通的反正切类似,但是因为输入的是2D坐标,所以输出范围变成了$(-\pi,\pi]$。
平面三角形的一些理论
表示方法
要表示一个三角形,最trivial的方法是存储它的三个顶点坐标$\mathbf a$、$\mathbf b$和$\mathbf c$。在平面中,我们可以用叉乘的$z$坐标计算三角形的面积
当$\mathbf a$、$\mathbf b$和$\mathbf c$代表的顶点按逆时针顺序排序时,$S$为正,顺时针则为负。
一般来说,几何体的信息是保存到三角形的顶点里的,而在渲染三角形内部时我们使用插值方法获取数据。
为了在三角形中方便地进行插值,我们以两边为轴,其相交的顶点为原点建立重心坐标系。
重心坐标系
在三角形$\Delta ABC$中,以$A$为原点,$\vec{AB}$、$\vec{AC}$为基向量建成的坐标系称作重心坐标系。
设点在坐标系中的坐标是$(\beta,\gamma)$,那么它的位置矢量$\mathbf p=\mathbf a+\beta(\mathbf b-\mathbf a)+\gamma(\mathbf c-\mathbf a)$,或者记为$\mathbf p=(1-\beta-\gamma)\mathbf a+\beta b+\gamma\mathbf c$,通常我们会令$\alpha=1-\beta-\gamma$采用对,从而得到对称记法
当且仅当$0<\alpha,\beta,\gamma<1$时,点在三角形内部。
设$\mathbf a=(x_a,y_a)$,$\mathbf b=(x_b,y_b)$,$\mathbf c=(x_c,y_c)$,$\mathbf p=(x_p,y_p)$,则以上$\mathbf p$的表达式可以记为
通过这个方程可以解出$\beta$和$\gamma$。要求$\beta$和$\gamma$,有另一种更直观的方法,如果我们取直线$AC$的方程$f_{AC}(x,y)=0$,将点的坐标带入左侧的函数后,得到的数值与点到直线的距离成正比,直线两侧的点代入函数后得到的值符号相反。这样我们就有如下的式子:
求出$\beta$和$\gamma$后,我们就可以方便地在三角形内进行插值。从上面的讨论可以发现,$\alpha$、$\beta$、$\gamma$分别表示$P$点到$A$、$B$、$C$的接近程度,且$\alpha+\beta+\gamma=1$。对于某个依附于顶点的量$m$,我们可以用下式表示这个量在三角形内的插值结果:
重心坐标的值还有一个意义,具体见下图。
立体三角形
重心坐标可以被几乎无感地扩展到立体情况。仍延续上节对$\mathbf a$、$\mathbf b$、$\mathbf c$的定义,三角形的面积
注意这里是不分正负的。三角形的法向量也很容易求出来:
其定向由$\vec{AB}$、$\vec{AC}$由右手定则确定。
参考重心坐标关于三角形面积的意义,我们可以得到立体三角形重心坐标的计算方法:
其中
这三个矢量的定义不是唯一的,满足定向即可。