实时渲染(第三版):第四章 转换 4.1.3 4.1.4

4.1.3 缩放

    缩放矩阵S(s) = S(sx,sy,sz), 将实体沿着xyz轴分别缩放 sx,sy,sz。这就是说缩放矩阵可以用来放大或缩小一个对象。si(i∈{x, y, z}, )越大,实体在对应方向上也就越大。S的公式如4.8所示:

    图4.4显示了缩放矩阵的效果。如果sx=sy=sz,则缩放操作被称为是统一的,否则是非统一的。有时用各向同性和各向异性替代统一和非统一。S的逆是S-1(s) = S(1/sx, 1/sy, 1/sz)

   使用同质坐标,另一种有效的创建统一缩放矩阵的方式是操作矩阵(3,3)位置处的元素(右下角的元素)。该值影响同质坐标的w部分,因此会缩放由矩阵转换的每个坐标。例如,为统一缩放因子5,则缩放矩阵(0,0)、(1,1)、(2,2)处可以设置为5,或者把(3,3)设置为1/5,如下所示:

   和使用S相比,S'必须被同质化。这可能导致效率低下,因为它需要处理同质化(相除)。如果(3, 3)位置处的值是1,就无需相除。当然,如果系统总是作相除操作,而不检查(3, 3)是否为1,就不会有多于的消耗。

   S的一个或三个部分的值是负值,那它就是一个反射矩阵,也叫做镜像矩阵(根据某些反射矩阵的定义,负值部分必须是-1)。如果只有两个部分是-1,那么将旋转π弧度。反射矩阵通常需要特殊处理。比如,顶点为逆时针顺序的三角形经过反射矩阵转换后,会变成顺时针顺序。这种顺序的改变可能导致错误的光照和背面剔除。为检测给定的矩阵是否以某种方式进行反射,我们可以计算矩阵左上3*3的元素的行列式。如果值为负,则是反射矩阵。

示例:在某方向缩放

    缩放矩阵S只沿着xyz轴进行缩放。如果需要在其他方向上进行缩放,则需要一个复合的转换。假设缩放需要沿着的正交轴右向为fx,fy,fz。则,首先构建矩阵F:

    思想是让由三个轴指定的坐标系统和标准坐标重合,然后使用标准缩放矩阵进行操作,最后再转换回去。第一步的执行可以通过和转置矩阵(如,F的逆)相乘。然后执行实际的缩放,接着转换回去。整个转换公式为:

X = FS(s)FT                                                 (4.11)



图 4.3 使用Hxz(s)错切单元方块的效果。y和z的值都没有受到转换的影响;但x的值是原x值+(s乘以z值),这导致了方块的倾斜。

4.1.4 错切

    另一种类型的转换是错切。它们可以用于游戏中整个场景的扭曲,以创造一种迷幻效果或者通过抖动创造一种模糊反射(参考节9.3.1)。有六种基本的错切矩阵(实际上,也只有这六种错切矩阵,因为我们只是在和主轴正交的平面中进行错切。不过,一个通用错切矩阵可以正交地错切任何平面),分别用Hxy(s),Hxz(s),Hyx(s),Hyz(s),Hzx(s),Hzy(s)表示。第一个下标用来表示哪个坐标要被错切,第二个下标用来表示使用哪个坐标执行错切。错切矩阵的一个例子,Hxz(s),显示于公式4.12中。可以发现,可以使用下标来找到参数s在矩阵中的位置;x(数字索引为0)标识行0,z(数字索引为2)标识列2,于是s就被定位在行0列2。

 

    点p乘以该矩阵的效果是产生了一个新点:(Px+sPz Py Pz)T。一个具体的例子在图4.3中给出。Hij(s)(使用第j个坐标错切第i个坐标)的逆可以通过在相反方向的错切来产生,即, Hij-1(s)=Hij(-s)。

    一些计算机图像纹理元素[348,349]使用的错切矩阵稍微有点不同:

    不过,此处,两个下标表示的是它们都将被使用第三个坐标进行错切。上面的错切矩阵和此处的错切矩阵的关系是H'ij(s,t) = Hik(s)Hjk(t), 其中k表示第三个坐标。具体使用哪个矩阵就是口味的问题了,还得看API的支持。

    最后,需要注意的是,错切矩阵的行列式值|H|=1,它是一个保持体积的转换(保积转换)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值