三角形重心坐标插值的作用?
在图形学中,利用重心坐标在三角形内部进行任何属性(位置、纹理坐标、颜色、法线、深度、材质属性…)的插值。一般我们通过其他步骤都会得到三角形顶点上的属性,但继续计算时需要用到三角形内部的某点的属性值,利用重心坐标可以得到三角形内部该值的平滑过渡。
什么是重心坐标(此处只考虑三角形)?
重心坐标是由三角形顶点定义的坐标。
- 三角形上的任一顶点p(x,y)都可以用三个顶点的线性组合表示:p=w1a+w2b+w3*c
- 且系数之和为1:w1+w2+w3=1 (只有系数之和为1,p点才在这个三角形所在的平面上)
- 当满足三个系数都为非负数时,该点在三角形内部
- 可以看出,重心坐标是齐次坐标的一种
这三个系数所表示的坐标(w1,w2,w3),就是该三角形上p点的(归一化)重心坐标。
为什么三个和为1的系数可以表示p点
三角形的顶点分别为a,b,c,将a看作为坐标系原点,a到b和c的向量为基向量,那么任意点p可以表示为
p=a+β(b-a)+γ(c-a)
移项得到:
p=(1-β-γ)a+βb+γc
定义一个新变量α,使得
α=1-β-γ
得出
p(α,β,γ)=αa+βb+γc,其中α+β+γ=1
所以点p的重心坐标就是p(α,β,γ)
重心坐标不仅可以表示三角形内部的点,也可以表示平面内的任意点,任意点在三角形abc内部,当且仅当
0<α<1,0<β<1,0<γ<1
当一个坐标为0,其余两个在(0,1)区间时,点落在三角形边上,如果两个坐标为0,另一个为1时,点落在三角形顶点上
重心坐标的由来
对于p=w1p1+w2p2+w3p3变形得w1(p1-p)+w2*(p2-p)+w3*(p3-p)=0,即
w1
p
p
1
⃗
\vec{pp1}
pp1+w2
p
p
2
⃗
\vec{pp2}
pp2+w3
p
p
3
⃗
\vec{pp3}
pp3=0
上式说明,如果p1点挂重物w1,p2点挂重物w2,p3点挂重物w3,则p正好是重心,如果把p点放在避雷针上,能够保持平衡
计算重心坐标的方法
面积法
A的系数α:其对应的三角形面积AA(红色部分)占总面积的比值
B的系数β:其对应的三角形面积AB(黄色部分)占总面积的比值
C的系数γ:其对应的三角形面积AC(蓝色部分)占总面积的比值
公式法
β=
(
y
−
y
a
)
(
x
c
−
x
a
)
−
(
x
−
x
a
)
(
y
c
−
y
a
)
(
y
b
−
y
a
)
(
x
c
−
x
a
)
−
(
x
b
−
x
a
)
(
y
c
−
y
a
)
{(y-ya)(xc-xa)-(x-xa)(yc-ya) \over (yb-ya)(xc-xa)-(xb-xa)(yc-ya)}
(yb−ya)(xc−xa)−(xb−xa)(yc−ya)(y−ya)(xc−xa)−(x−xa)(yc−ya)
γ=
(
y
−
y
a
)
(
x
b
−
x
a
)
−
(
x
−
x
a
)
(
y
b
−
y
a
)
(
y
c
−
y
a
)
(
x
b
−
x
a
)
−
(
x
c
−
x
a
)
(
y
b
−
y
a
)
{(y-ya)(xb-xa)-(x-xa)(yb-ya) \over (yc-ya)(xb-xa)-(xc-xa)(yb-ya)}
(yc−ya)(xb−xa)−(xc−xa)(yb−ya)(y−ya)(xb−xa)−(x−xa)(yb−ya)
α=1-β-γ
三角形颜色插值实现
1.使用公式法计算出每个像素点的重心坐标α、β、γ
2.三角形的三个顶点为a,b,c,对于在三角形内部的像素p,它的颜色值为
p.color.red=α*a.color.red+β*b.color.red+γ*c.color.red;
p.color.green=α*a.color.green+β*b.color.green+γ*c.color.green;
p.color.blue=α*a.color.blue+β*b.color.blue+γ*c.color.blue;