Q96:PT(2):纹理的仿射变换(Textures And Transformations)

标题中的“PT”表示:Procedural Texture(过程纹理)。表示该章节属于“过程纹理”的内容。
当前章节在“过程纹理”内容中的位置:
过程纹理(0)——概述
过程纹理(1)——方格纹理(1)——3D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(1)——平面2D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(2)——球面2D方格纹理
过程纹理(1)——方格纹理(2)——2D方格纹理(3)——圆柱2D方格纹理
过程纹理(2)——纹理的仿射变换

1,理论分析

特别声明:可以对所有的纹理进行仿射变换,但是我们是以3D方格纹理来学习纹理的仿射变换的。

为什么要对纹理进行仿射变换?

我们先看一组图:
这里写图片描述
假设,我们要对所有半径的球面添加类似于R=3的3D方格纹理。当我们将R=3球面上的这套纹理直接添加到R=2、R=1、R=0.5的球面上时(效果如上图),这套纹理对于这些小半径球面来说,明显是“太大”了。这个效果并不是我们想要的。

我们想要的是下面这种效果:
这里写图片描述
一方面,我们想要将R=3球面这套纹理添加到小半径的球面上;另一方面,我们希望在将这套纹理添加到小半径球面上时,能够对纹理进行相应的缩小,以便纹理在小半径球面上的效果和R=3球面上的效果一样。换句话说,若半径缩小到原来的三分之一变成了R=1,R=3这套纹理也要缩小到原来的三分之一,以便适合R=1的球面。

怎么对纹理进行缩小变换呢?

接下来,我们抽取纹理中的四个方格来进行说明。

这里写图片描述
现在问题清晰了:若要对纹理进行某种仿射变换,只需要对用于计算纹理的撞击点的坐标值进行相反的变换即可。

更具体地说,由纹理的仿射变换得到相应的逆变换矩阵,然后用这个逆变换矩阵乘以撞击点坐标值得到新坐标值,然后根据新坐标值计算得到的就是进行仿射变换之后的纹理。

2,C++代码实现

像几何物体的仿射变换一样,我们定义一个“实例类InstanceTexture”。只不过Instance作用的是集合物体,InstanceTexture作用的是纹理。
之前Instance学习的链接:http://blog.youkuaiyun.com/libing_zeng/article/details/60160279

部分代码截图如下:

这里写图片描述

这里写图片描述

3,测试图形

3.1 测试代码

这里写图片描述
这里写图片描述

3.2 输出图形

R=3:it_ptr->scale(1.0)
这里写图片描述

R=2:it_ptr->scale(1.0/1.5)
这里写图片描述

R=1:it_ptr->scale(1.0/3)
这里写图片描述

R=0.5:it_ptr->scale(1.0/6)
这里写图片描述

4,其他说明

完整代码下载路径:http://download.youkuaiyun.com/detail/libing_zeng/9797145

Referrance:
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K PetersLtd, 2007.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值