前言
前面咱们发了两篇文章,主要讲了直线光栅化和直线插值的内容,这一节咱们聊一聊三角形插值算法,主要就是利用重心坐标公式。先忽略如何进行三角形光栅化的内容,后面有时间可以补上!
正文
为什么需要三角形插值?
关于直线插值在前面文章已描述过,针对三角形插值,思想也是类似。简要描述下:
如果我们知道屏幕上三角形的三个顶点各自的属性值,如何得知三角形内部覆盖所有像素位置的属性值呢?
这个问题的答案就是回答!
什么是三角形插值?
这里就用数学符号简易的描述下:
已知三角形的三个顶点 v 0 v_0 v0、 v 1 v_1 v1、 v 2 v_2 v2,每个顶点的属性值 f ( v 0 ) f(v_0) f(v0)、 f ( v 1 ) f(v_1) f(v1)、 f ( v 2 ) f(v_2) f(v2),要求计算所有三角形内的顶点 v i n v_{in} vin的属性值 f ( v i n ) ? f(v_{in})? f(vin)?
如何进行三角形插值?
虽然可能也会有别的三角形插值算法,但是咱们重点介绍:重心坐标插值算法!
1、结论
对于三角形 △ A B C \triangle ABC △ABC 内任意一点 p p p,都存在 0 < α 、 β 、 γ < 1 且 α + β + γ = 1 0 < \alpha、\beta、\gamma < 1 且 \alpha + \beta + \gamma = 1 0<α、β、γ<1且α+β+γ=1 ,使得 f ( p ) = α f ( A ) + β f ( B ) + γ f ( C ) f(p) = \alpha f(A) + \beta f(B) + \gamma f(C) f(p)=αf(A)+βf(B)+γf(C)
为了更好的简述算法核心内容,咱们忽略三角形边界情况,也就不考虑取0和1的情况啦!
2、核心理解
通过观察上面的结论,给人的感觉就像是,只要通过三角形三个顶点属性值的加权混合,就可以获得三角形内部任何位置的顶点的属性值!
3、几何理解-重心坐标公式推导
(1)已知三角形 △ A B C \triangle ABC △ABC,其中一点 P P P 位于三角形内部
(2) 借助向量辅助推导,推导出顶点P和A、B、C的关系
∵ 向量 A B ⃗ , A C ⃗ 线性无关 ∴ 一定 ∃ 常数 β 、 γ 使得 A P ⃗ = β A B ⃗ + γ A C ⃗ ∵ A B ⃗ = B − A , A C ⃗ = C − A , A P ⃗ = P − A ∴ P − A = β ( B − A ) + γ ( C − A ) ∴ P = ( 1 − β − γ ) A + β B + γ C 记 α = 1 − β − γ , 从而 ∃ ( α + β + γ = 1 ) , 使得 P = α A + β B + γ C \begin{aligned} &\because 向量 \vec{AB} , \vec{AC} 线性无关\\ &\therefore 一定 \exists 常数 \beta、\gamma 使得\vec{AP} = \beta\vec{AB} + \gamma\vec{AC}\\ &\because\vec{AB} = B-A,\vec{AC} = C-A,\vec{AP} = P-A\\ &\therefore P - A = \beta(B-A) + \gamma(C-A)\\ &\therefore P = (1 - \beta - \gamma)A + \beta B + \gamma C\\ &记\alpha = 1 - \beta - \gamma,从而\exists (\alpha + \beta + \gamma = 1),使得P = \alpha A + \beta B + \gamma C\\ \end{aligned} ∵向量AB,AC线性无关∴一定∃常数β、γ使得AP