重心坐标

166 阅读1分钟

例如颜色等信息一般储存在三角形的顶点中,在进行着色时需要使用三个顶点的属性进行插值。在片段着色器中,通常使用三角形重心坐标进行插值。此种计算方法运算逻辑简单,适合在GPU上进行计算

2D三角形

由点aabbcc构成的2D三角形

面积公式

area=12xbxaxcxaybyaycya=12(xayb+xbyc+xcyaxaycxbyaxcyb)area = \frac{1}{2} \begin{vmatrix} x_b-x_a & x_c-x_a\\ y_b-y_a & y_c-y_a\\ \end{vmatrix} =\frac{1}{2}(x_ay_b+x_by_c+x_cy_a-x_ay_c-x_by_a-x_cy_b)

坐标形式

p(α,β,γ)=αa+βb+γc\bold{p}(\alpha,\beta,\gamma)=\alpha\bold{a}+\beta\bold{b}+\gamma\bold{c}

α+β+γ=1\alpha+\beta+\gamma=1

当且仅当α,β,γ\alpha,\beta,\gamma满足

{0<α<10<β<10<γ<1\begin{cases} 0<\alpha<1\\ 0<\beta<1\\ 0<\gamma<1 \end{cases}

坐标才会在三角形内

计算重心坐标

γ=(yayb)x+(xbxa)y+xaybxbya(yayb)xc+(xbxa)yc+xaycxcya\gamma = \frac{(y_a-y_b)x+(x_b-x_a)y+x_ay_b-x_by_a}{(y_a-y_b)x_c+(x_b-x_a)y_c+x_ay_c-x_cy_a}
β=(yayc)x+(xcxa)y+xaycxcya(yayc)xb+(xcxa)yb+xaycxcya\beta = \frac{(y_a-y_c)x+(x_c-x_a)y+x_ay_c-x_cy_a}{(y_a-y_c)x_b+(x_c-x_a)y_b+x_ay_c-x_cy_a}
α=1βγ\alpha=1-\beta-\gamma

也可以用面积的比值来表示

α=Aa/Aβ=Ab/Aγ=Ac/A\alpha=A_a/A\\ \beta=A_b/A\\ \gamma=A_c/A\\

在进行计算时实际只需要计算其中任意三个面积

3D三角形

面积公式

使用三维向量的叉乘运算求三角形面积

area=12(ba)×(ca)area=\frac{1}{2}||(\bold{b}-\bold{a})\times(\bold{c}-\bold{a})||

但是此处计算的不是有符号面积,即计算的是三角形面积的绝对值,不能直接用于计算重心坐标。

在计算重心坐标时,需要考虑面积的符号

可以发现,按顺时针和逆时针方向定义的顶点顺序,在计算法向量时会得到方向相反的结果

而使用点乘的方式,就可以通过向量的夹角计算出有符号面积,有

α=nnan2,β=nnbn2,γ=nncn2\alpha=\frac{\bold{n}\cdot{\bold{n_a}}}{||\bold{n}||^2}, \beta=\frac{\bold{n}\cdot{\bold{n_b}}}{||\bold{n}||^2}, \gamma=\frac{\bold{n}\cdot{\bold{n_c}}}{||\bold{n}||^2}

其中

na=(cb)×(pb)nb=(ac)×(pc)nc=(ba)×(pa)\bold{n_a}=(\bold{c}-\bold{b})\times(\bold{p}-\bold{b})\\ \bold{n_b}=(\bold{a}-\bold{c})\times(\bold{p}-\bold{c})\\ \bold{n_c}=(\bold{b}-\bold{a})\times(\bold{p}-\bold{a})

坐标形式

坐标形式与2D相同

p(α,β,γ)=αa+βb+γc\bold{p}(\alpha,\beta,\gamma)=\alpha\bold{a}+\beta\bold{b}+\gamma\bold{c}

α+β+γ=1\alpha+\beta+\gamma=1

参考资料

Fundamentals of Computer Graphics.Fifth Edition