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

article/2025/9/4 19:07:29

变换(下)

  • 顶点混合(vertex blender)
  • 渐变(Morphing)
  • Geometry Cache Playback
  • 投影(Projections)
    • 透视投影

顶点混合(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详解)


http://chatgpt.dhexx.cn/article/1qo9vx0N.shtml

相关文章

基于图像的虚拟换装:Morphing architectures for pose-based image generation of people in clothing

项目的重点是变形操作的特征化与实现,解决卷积神经网络中的信息失准问题。我们将所研究的方法应用到一个换衣服的任务中,将其建模为一个条件图像生成问题。尽管对抗性方法在生成性任务中很流行,但我们将此项目的范围限制为监督方法&#xff0…

Traffic morphing阅读笔记

文章目录 前言1 变形1.1 符号表示及算法讲解1.1.1 符号1.1.2 凸优化求解1.1.3 降低开销1.1.4大样本空间分治1.1.5实验中的注意事项短会话源分布变化多样数据包分片 2 实验评估2.1 加密IP语音识别白盒变形黑盒变形2.1.1 与原始分类器对抗二元分类器三元分类器 2.1.2 不可区分性评…

云波社区 l Mecha Morphing(变形机甲)游戏介绍

Mecha Morphing(变形机甲)由YGG领投的一个创新型GameFi项目即将开始打金! 简单介绍一下,该游戏由Call of duty核心团队研发,画风完美阐释暴力美学。在MechaMorphing元宇宙中,玩家可以通过参与PVE, PVP, 土地…

Real-Time Rendering——4.5 Morphing 变形

Imagine that one model is displayed at time t0 and we wish it to change into another model by time t1. For all times between t0 and t1, a continuous “mixed” model is obtained, using some kind of interpolation. An example of morphing is shown in Figure 4.…

《数字图像处理》dlib人脸检测获取关键点,delaunay三角划分,实现人脸的几何变换warpping,接着实现两幅人脸图像之间的渐变合成morphing

这学期在上《数字图像处理》这门课程,老师布置了几个大作业,自己和同学一起讨论完成后,感觉还挺有意思的,就想着把这个作业整理一下 : 目录 1.实验任务和要求 2.实验原理 3.实验代码 3.1利用人脸特征点检测工具dli…

OpenCV:图像变形(Image Morphing)

融合/形变技术 Image Morphing的原理是十分简单的。有两幅图像 I 和 J ,我们希望通过融合图像 I 和 J 来创建一幅新的图像 M. 图像 I 和 J 的融合过程是由参数 alpha 来控制,参数 alpha 介于0和1之间。当alpha 0,新的图像 M看起来更接近 I;当alpha 1&…

计算机动画作业:图像morphing

本学期选了计算机动画课程,第一次作业是图像morphing, 本来打算选择基于四边网格的morphing, 但因为要用到曲面插值,感觉比较麻烦,因此使用基于三角网格的face morphing。 一、总体方案 1、检测人脸特征点&#xff0…

Morphing

<script src"http://widgets.amung.us/classic.js" type"text/javascript"></script> <script type"text/javascript"> </script> Morphing 这篇文章给大家介绍一下morphing&#xff0c;它是一种变型动画&#xff0c;…

深度学习中的GPU与CUDA

对应视频教程&#xff1a;https://www.bilibili.com/video/BV1S5411X7FY/ 文章目录 1. 显卡&#xff08;GPU&#xff09;与驱动2. 显卡与CUDA3. 如何查看自己的显卡 1. 显卡&#xff08;GPU&#xff09;与驱动 显卡&#xff0c;也称之为 GPU。GPU 的全称是 Graphics Processin…

CUDA详解

CUDA&#xff08;Compute Unified Device Architecture&#xff0c;统一计算设备架构&#xff09;&#xff0c;是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构&#xf…

CUDA入门

1. 引言 CUDA为a platform and programming model for CUDA-enabled GPUs。该平台通过GPU来进行计算。CUDA为GPU编程和管理 提供C/C语言扩展和API。 CUDA编程中&#xff0c;会同时使用CPU和GPU进行计算&#xff1a; CPU system&#xff1a;称为host。GPU system&#xff1a;…

cuda和cudatoolkit

Pytorch 使用不同版本的 cuda 由于课题的原因&#xff0c;笔者主要通过 Pytorch 框架进行深度学习相关的学习和实验。在运行和学习网络上的 Pytorch 应用代码的过程中&#xff0c;不少项目会标注作者在运行和实验时所使用的 Pytorch 和 cuda 版本信息。由于 Pytorch 和 cuda 版…

最新CUDA环境配置(Win10 + CUDA 11.6 + VS2019)

最新CUDA环境配置(Win10 CUDA 11.6 VS2019) 本篇博客根据NVIDIA 官方文档所述, 并根据自己实践得出. 供各位需要的朋友参考. 1.前言 本篇文章的软件环境为: Windows 10CUDA 11.6VS2019 CUDA是目前做人工智能, 深度学习等方向的必备工具库. 由CUDA衍生出的加速工具很多, …

一文搞懂CUDA

什么是cuda 统一计算设备架构&#xff08;Compute Unified Device Architecture, CUDA&#xff09;&#xff0c;是由NVIDIA推出的通用并行计算架构。解决的是用更加廉价的设备资源&#xff0c;实现更高效的并行计算。 CUDA是NVIDIA公司所开发的GPU编程模型&#xff0c;它提供…

GPU,CUDA,cuDNN的理解

我们知道做深度学习离不开GPU,不过一直以来对GPU和CPU的差别,CUDA以及cuDNN都不是很了解,所以找了些资料整理下,希望不仅可以帮助自己理解,也能够帮助到其他人理解。 先来讲讲CPU和GPU的关系和差别吧。截图来自资料1(CUDA的官方文档): 从上图可以看出GPU(图像处理器,…

CUDA编程之快速入门

CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架构。做图像视觉领域的同学多多少少都会接触到CUDA,毕竟要做性能速度优化,CUDA是个很重要的工具,CUDA是做视觉的同学难以绕过的一个坑,必须踩一踩才踏实。CUDA编程真的是入门容易精通难,具有计算机体…

CUDA学习

想想学习CUDA的时间也应该有十来天了&#xff0c;也该是做一个小总结了&#xff0c;说说我理解的CUDA&#xff0c;它到底是什么东西&#xff1f; 其实说到CUDA&#xff0c;还真的没几个人知道&#xff0c;说实话&#xff0c;我也听说不久&#xff0c;主要因为它2007年才刚发布&…

CUDA简介

CUDA简介 CUDA是什么 CUDA&#xff0c;Compute Unified Device Architecture的简称&#xff0c;是由NVIDIA公司创立的基于他们公司生产的图形处理器GPUs&#xff08;Graphics Processing Units,可以通俗的理解为显卡&#xff09;的一个并行计算平台和编程模型。 通过CUDA&#…

CUDA是什么-CUDA简介

在大家开始深度学习时&#xff0c;几乎所有的入门教程都会提到CUDA这个词。那么什么是CUDA&#xff1f;她和我们进行深度学习的环境部署等有什么关系&#xff1f;通过查阅资料&#xff0c;我整理了这份简洁版CUDA入门文档&#xff0c;希望能帮助大家用最快的时间尽可能清晰的了…

java队列和栈 共同_java 栈和队列的模拟--java

栈的定义&#xff1a;栈是一种特殊的表这种表只在表头进行插入和删除操作。因此&#xff0c;表头对于栈来说具有特殊的意义&#xff0c;称为栈顶。相应地&#xff0c;表尾称为栈底。不含任何元素的栈称为空栈。 栈的逻辑结构&#xff1a;假设一个栈S中的元素为an,an-1,..,a1&am…