前言
在前面的文章中我们经常提到知道某个三角形三个顶点的属性,然后就可以求出三角形内部某一点对应的属性。例如深度缓存的时候,高洛德着色的时候等等,但是我们一直没有说具体应该如何计算,本文就来介绍一下这一部分内容。
想要计算三角形内部某一点对应的属性,也就是我们一直说的三角形的插值,就需要用到重心坐标的概念。
直线的重心坐标
在讲三角形的重心坐标前,我们先来看一看直线上的重心坐标是怎么定义的。
求直线上任意一点
设我们有两个点 A 和 B ,它们可以连成一条直线。那么该直线上的任意一点 P 必然满足:
k为一个常数,其值也很好求,取任意轴三个点值进行计算即可:
然后我们可得:
因为 即 。
而 通过向量的减法,我们可以理解为 ,同样的 ,那么就可得到 ,然后可以得到 ,最终简化可得:
而 ,, 分别代表的就是 P,A,B三个点的坐标,因此可得
P = (1 - k)A + kB
因为 P = ((1-k)+k)P 因此上面式子可以变为 (1-k)A+kB-((1-k)+k)P=0,化简为 (1-k)(A-P)+k(B-P),即:
几何意义
前面我们得到 ,即AP的长度 为 AB的长度 的k倍。而 BP的长度 又等于 ,因此 的长度为 的 1-k 倍。所以可得:
因为长度是没有正负的,然而实际上k可能为负数,就会导致上面的公式不对。我们先来看看下面三种情况:
0 <= k <= 1
此时P在AB之间,如下图
可得
k < 0
k < 0 ,也就是说 方向和 相反,此时P在AB之外,离A更近一些,如下图
可得
k > 0
和前者相反,如下图
可得
总结
可以发现我们只要取绝对值,就可以满足上面的各种情况了,因此
直线上的重心坐标
通过上面的推导,我们就知道直线AB上的任意一点P,都可以由一个k来计算出来的。当然了,也可以通过P来推出k的值,怎么求上面已经说明过了。
<