纹理中小方块中的数字表示颜色值。
计算P的uv坐标的步骤是什么?
#1 楼
这是通过重心插值实现的。首先,我们找到$ P $的重心坐标。重心坐标表示每个顶点为该点贡献的权重,可用于在三角形的整个面内的顶点处内插任何已知的值。
考虑3个内部三角形$ ABP $ ,$ PBC $和$ PCA $。
可以说,重心坐标或点$ P $上顶点$ A $的权重成比例内三角形$ PBC $的面积与整个三角形$ ABC $的面积之比。
如果我们认为当$ P $逼近$ A $三角形$时,这是显而易见的PBC $变大,另外两个变小。
从直觉上也可以看出,三角形内某个点的重心坐标总和始终等于$ 1 $。因此,仅找到两个坐标即可得出第三个坐标。
计算重心坐标的方法是:
$$ \ begin {aligned}
{Bary} _A&= \ frac {(B_y-C_y)(P_x-C_x)+(C_x-B_x)(P_y-C_y)} {(B_y-C_y)(A_x-C_x)+(C_x-B_x )(A_y-C_y)} \\
{Bary} _B&= \ frac {(C_y-A_y)(P_x-C_x)+(A_x-C_x)(P_y-C_y)} {(B_y-C_y) (A_x-C_x)+(C_x-B_x)(A_y-C_y)} \\
{Bary} _C&= 1-{Bary} _A-{Bary} _B
\ end {aligned} $ $
维基百科文章中解释了推导和推理。
一旦有了坐标,就可以通过在顶点处插值确定$ P $的纹理坐标。使用重心坐标作为权重:
$$ P_ {uv} = {Bary} _A \ cdot A_ {uv} + {Bary} _B \ cdot B_ {uv} + {Bary} _C \ cdot C_ {uv} $$
在本演示文稿中也很好地解释了原因。
也请参见此问题以获取有效的计算方法。
评论
$ \ begingroup $
我在$ Bary_B $中错了吗?第一项应该是$(A_y-C_y)$还是我错了?
$ \ endgroup $
– joojaa
16年1月6日在7:35
$ \ begingroup $
@joojaa我不这么认为。维基百科的文章中也是如此,从我做过的测试计算来看,这似乎是正确的。
$ \ endgroup $
– Rottem
16年1月6日在7:52
$ \ begingroup $
啊,所以是$-(A_y-C_y)$,可能需要指出,因为您将预先计算$ AC_y =(A_y-C_y)$。
$ \ endgroup $
– joojaa
16年1月6日在8:11
$ \ begingroup $
@joojaa可以为每个三角形预先计算整个分母和分母中的某些项,只有少数项取决于$ P $。我添加了一个链接到有关计算方法的问题的链接。在这个公式中,我认为最好使符号保持简单统一而不是有效。
$ \ endgroup $
– Rottem
16年1月6日在8:15
评论
有一个仿射变换可以将每个角映射到其纹理坐标,您可以使用仿射变换将P映射到其uv。@ratchetfreak您能给我一个链接吗?
本文一口气写了一篇关于如何进行交点计算以及重心线计算的文章。这本质上相当于变换三角形。