纹理映射到三角形的具体方法

    首先声明,本人的水平是属于纯属娱乐的那种,不敢说话,最怕别人骂。而且这种方式是我从书上看到的大致意思,我自己实践了下,可以达到效果,但是不知道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。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值