首先声明,本人的水平是属于纯属娱乐的那种,不敢说话,最怕别人骂。而且这种方式是我从书上看到的大致意思,我自己实践了下,可以达到效果,但是不知道D3D是不是这样的。切入正题。
首先要提到的一个就是向量了,图形学的很多算法和实现貌似都离不开这个,嘻嘻,感觉向量和矩阵就是图形学的数学基础一样。
对于二维空间中的某一点P,可以用一个原点P0,可以用一和2个不平行的向量来表示(这句话虽然不正规,但是应该没错的)。嘻嘻,这样,三角形内部的任一点,都可以表示成如下方式了:
屏幕顶点(x,y) 对应纹理中的三角形(UV坐标)
P = P0 + a(P1 - P0) + b(P2 - P0); // (太痛苦了,不太会用,不加下标了)
坐标原点是P0,两条轴分别是P0P1和P0P2。
对于每一点P(x,y),上面这个公式都是成立的.可以得到:
Px = P0x + a(P1x - P0x) + b(P2x - P0x);
Py = P0y + a(P1y - P0y) + b(P2y - P0y);
哈哈,看到这种方程,习惯性就开始想起矩阵了吧。我们换一种表示方式,用矩阵来表示:
(Px,Py,1) = (a,b,1) * M;
P1x - P0x P1y - P0y 0
M = P2x - P0x P2y - P0y 0
P0x P0y 1
杯具了,符号不会打,我感觉还是能看出M是个3X3矩阵的。
这样可以获取到P在新坐标系中的表达方式了。也就是说,我们可以知道P在新坐标系中的a,b坐标值。通过上面的方程可以得到(a,b,1) = (Px,Py,Pz) * M-1(M-1是M的逆矩阵)。这样,P点可以由P0P1P3三个顶点插值得到。
P点的纹理坐标可以如下得到,同样先给出方程组表示
Pu = P0u + a(P1u - P0u) + b(P2u - P0u)
Pv = P0v + a(P1V - P0v) + b(P2v - P0v)
用矩阵表示为: (Pu,Pv,1) = (a,b,1) * M1; 同样的方法计算M1
P1u - P0u P1v - P0v 0
M1 = P2u - P0u P2v - P0v 0
P0u P0v 1
到现在,我们终于可以根据P的位置坐标,获取到P的纹理坐标了,
(Pu,Pv,1) = (Px,Py,1) * M-1 * M1;
如果只看方程组形式的表达,就会发现纯属解方程。
得到的P的纹理坐标依然是[0,1]的,只要相应的乘以纹理图片的宽高就可以得到像素点了,当然,得到的像素点也是一个浮点数,这个时候可以采用很多种过滤方式,临近点啊,线性插值啊等等。
初次写文章,千万别骂我,可能有很多考虑不周或者根本就错误的地方,欢迎指出。我发现编辑文字对我来说实在是太难了,怪不得毕业论文改了那么久。邮箱yanjiujun@gmail.com。