实时渲染(RealTimeRendering-4thEdition)笔记——4变换(下)

顶点混合(vertex blender)

现在我们想象要完成一个手臂的活动动画,它包括上臂和小臂,通过设置两个模型的刚体变换(旋转+位移)我们确实能够完成它的屈肘动作,但这一定无法达到与实际类似。这是因为两个分离的部分我们使用了两个模型,在连接处一定会出现模型重叠的情况。要达到逼真效果,我们要考虑使用一个模型模拟手臂,但是静态模型中是无法实现手肘部位的柔韧连接效果的。
在这里插入图片描述
顶点混合技术就是为了实现这一效果而提出的方法。以上文给出的例子为例,顶点混合技术仍然将上臂小臂的动画分离开来,而对连接部位实现弹性的皮肤效果。在连接部位的顶点中,有一部分受小臂的变换矩阵所控制,而另一部分受上臂的变换矩阵所控制,这就可能得到一个三角形的三点使用了不同的变换矩阵,这就与我们之前提到的基础的变换方法相区别开来。
基于这种想法,我们再做进一步思考,我们可以通过设定权值,让不同位置的点分别受到多个变换矩阵的影响。这种想法通过对动画模型设置骨骼(a skeleton of bones) 来实现,每个骨骼所设定的变换矩阵都可以通过用户设定的权值,叠加的影响骨骼上覆盖的任意一点(称为皮肤skin)。
这一过程的公式描述如下:
在这里插入图片描述
其中骨骼数目有n个,受影响的皮肤顶点为p,M矩阵为骨骼的局部坐标系映射到世界坐标系的变换矩阵(一般骨骼的连接点被设置为局部坐标系的中心),而w为权值,我们设定权值非负且和为1,矩阵B为每个骨骼设置的变换矩阵,它受时间影响发生变化从而产生动画效果,一般多个基础的变换相叠加而组成一个B矩阵,我们可以通过动作的开始与结束的B通过插值设置每一时刻的B矩阵形式。
使用这种方式,我们只需要从CPU向GPU传递一次模型的顶点信息,而每一帧我们只需要更新骨骼的变换矩阵即可。这使得向GPU传递数据的代价被最小化。
在有一些算法中,如果我们需要得到特殊的变形效果,权值的设置可以不受01区间以及和为1的限制,例如变形目标(morph targets)
在实际应用中,使用上述基础的顶点混合方法有可能得到我们不想要的折叠变形自交的情况。在这里插入图片描述在这里插入图片描述
这一情况我们可以使用称为对偶四元数(dual quaternions) 的混合方法,它能够保持变换的坚硬属性,避免出现糖果包装纸一样的肢体变形,而且它的计算代价小于普通线性混合技术的1.5倍,同时得到更优的变化结果。

渐变(Morphing)

从一个三维模型向另一个三维模型完成渐变(morphing),在动画制作有很高的应用价值。假设我们在t0时刻的模型状态和t1时刻的模型状态是已知的,那在两个时刻中间的模型状态都是通过某种插值方法得到的“混合”模型。
渐变需要解决两个主要的问题:顶点对应(vertex correspondence)插值(interpolation)。对于两个任意的模型,它们可能有不同的拓扑结构,不同的顶点数目,不同的模型联系。因此我们首先要完成顶点对应。这一领域比较困难建议有兴趣的读者参考Alexa’s survey。
如果在不同模型的顶点已经存在了一一映射的关系,我们就可以对二者进行插值操作。比如线性插值就是一种可行方法:设s = (t-t0)/(t-t1),则
在这里插入图片描述
除了线性插值还用很多易于理解和用户进行控制的插值方案,下面介绍变形目标morph targets又称融合形态blend shapes
在这里插入图片描述
在开始的时候我们需要定义一个初始中性状态neutral model,我们举一个实际的面部控制应用,那么初始的中性状态就会是一个面无表情的模型,我们将他定义为符号N。此外在定义不同的面部表情模型Pi 其中i∈[1,k]。我们把P集合分别与N做差,得到每一种表情与原始表情的插值D,通过多个D的累加到原始N上我们就能得到不同的面部表情。公式如下:
在这里插入图片描述
式子中不同的D使用的权值是不相关的,比如控制眼睛变化的Deye和控制嘴的Dmouth间完全独立,是可以直接叠加的。在某些情况我们也可以通过设置小于0或者大于1的权值来得到我们所需要的效果。

Geometry Cache Playback

在有些时候我们需要实现高质量的动画,通过美工的努力,我们对每一帧中的顶点信息都进行了设置,我们通过从硬盘中读出数据来对网格信息进行更新。可是这一方法势必会导致极高的数据传输需求。对于一个有30000点的小模型,可以计算得到每秒50MB的数据传输。因此为了解决这一需求,Geometry Cache Playback被提出可以将数据传输需求减少到原始的10分之1。
首先要对数据量化,比如我们可以使用16位的整形来存储每个顶点的位置和纹理的坐标。其次就可以进行时空预测(spatial and temporal predictions )。例如空间上使用平行四边形预测,对于一个三角形,我们可以猜测出在其周围可能出现的点会在与三角形的三个点组成平行四边形的点位(可以看出这种点对应一个三角形有三个)。时间上我们使用类似于MPEG的视频压缩方法,把每n个帧组合在一起进行压缩。在相邻的帧我们通过检测两帧之间的差别来预测第三帧的变化幅度。以上方法都可在实时渲染的过程中应用于流数据从而减少数据存储消耗。

投影(Projections)

在我们渲染一个场景之前,我们需要将场景中的模型投影到某种类型的视域体中,随后进行裁剪和渲染。之前我们提到的变换可能都不会改变第四维w坐标的数值(点变换后仍然是1、方向变换后仍然是0),而且变换矩阵的最后一行永远使用0 0 0 1向量,但是这两个属性在投影变换矩阵Perspective projection matrices中是不成立的,我们需要使用齐次化过程 homogenization对变换结果除以w让结果的w坐标统一为1。在这一节中我们约定,z的负方向为视线方向,y轴向场景上方,x向视线右方,如此定义为右手坐标系。

书中正交投影部分略过

透视投影

透视投影中原始为平行的线在透视结果中会不平行,两两平行的一组线透视结果会全部延长汇聚于一点。透视投影更符合人类视觉感知(近大远小)。
通过设置近平面上下左右边界(l r b t),以及近平面远平面的z坐标(n f)我们可以唯一确认一个视锥view frustum。使用透视变换矩阵Pp得到齐次坐标
在这里插入图片描述
对点p施加投影变换(远平面映射为1、近平面映射为-1),得到的结果使用透视除法
在这里插入图片描述
就能得到一个视锥对应的单位立方体坐标系
在这里插入图片描述
在单位立方体内的坐标称为标准设备坐标

注意裁剪过程设置在透视变换之后、透视除法之前,这是因为裁剪会产生新的点(切一个三角形会变成四边形),我们要计算新的点的属性,这需要使用线性插值,由于透视除法不是线性变换,得到的结果不能使用线性插值,因此裁剪要在做除法之前进行。
最后我们要注意的是在完成透视投影之后得到的标准设备坐标中,z坐标会与原始z坐标为负倒数关系
在这里插入图片描述
这意味着靠近近平面的点z坐标变化幅度较大,而远处的点z坐标变化较为平缓,因此在原始世界坐标系下,z坐标差别有可能在透视投影后的标准设备坐标中由于浮点数精度而损失掉。为了解决这个问题,一般的解决办法是reversed z,即将原本近裁剪平面映射到深度值0,远裁剪平面映射到深度值1的映射关系反过来,让近裁剪平面映射到深度值1,远裁剪平面映射到深度值0,我们使用浮点数表示深度,浮点数有靠近0处表示精度高的特点,如此可以使得曲线平缓的地方由靠近0的浮点数表示,使得深度表示趋于均匀。(解释的不好粘贴巨佬的链接:reversed-z详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值