我的毕业设计,做一个动画插值

原文请查看:http://www.ibaiyang.org/2013/05/20/introduced-a-3d-geometric-interpolation-algorithm/

 

这原本是我 毕业设计 所做的事,但是看到如此的神奇,打算来介绍一下它,你会看到如此清晰,简单的逻辑思维如何来解决实际问题的。我深深的被这些算法折服。

维基百科解释说,插值(interpolation)是一种利用已知离散的数据集产生新的数据集的方法,一般有能通过 曲线拟合 和 回归分析等方法实现,最长见的莫过于 线性插值。

那3D几何插值是怎么回事呢?

 插值

 以上图片的最左,最右一列分别是源网格,目标网格,那么3D插值的目的就是自动生成其中间帧过程,以上图的第2,3和4列分别是0.25,0.5和0.75的插值结果。正是基于此,3D插值目前在图形学界非常的火,其在动画领域有非常广阔的前景。

多尺度几何插值(multi-scale interpolation)

算法的基本流程如下:

算法流程

构建层次树

层次结构

开始,我们将完整的网格作为层次树的根节点(level 0),然后在此节点上的网格中随即选取一些三角形,作为下一层节点的种子三角形。假设我们规定每一节点包含m个子节点。故可得知该节点的种子三角形个数等于该节点的子节点数 。我们定义组成每一节点的所有三角形构成一个patch。通过这些种子三角形,依靠相邻关系,逐步的形成了一块一块的区域,也可以叫做patch,直到这些patch相遇,并且相邻的patch包含长度为1的三角形带为止。实验证明,随机种子三角形的位置对插值结果并没有太大的影响,比较好的位置,可以减少层次树的高度,有利于减少计算量。经过验证,不管输入网格的点和面个数或多还是或少,最理想的高度都在10至20之间。从根节点开始递归,我们已经在层次树的level 1创建了m个patch了。

通过递归的应用此模式,我们就能创建整棵层次树了,当然,我们可以定义层次树的最低一层叶节点包含的三角形个数小于等于m 。在叶节点上,我们就可以对每一个三角形和三角形对的二面角进行插值了。

线性插值

 

构建好了层次树,我们只需要在叶节点进行线性插值,此算法只是对三角形的边长和相邻三角形对的二面角进行插值,如下图:

线性插值

线性插值公式如下

线性插值公式

其他的以此类推。

下图是一个demo

线性插值结果

配准和融合

该过程是本算法的核心,有点难理解。我们知道在构建层次树时,我们要求在同一层相邻patch,也就是某节点下的子节点之间,共有一个长度为1的三角形带,如下图是根节点下的子节点之间的三角形带

三角形带

由于我们知道插值的时候其实都是在各自的坐标系里进行插值,换句话说,我们并不关心叶节点插值后的顶点坐标值,因为正是由于这些三角形带,我们可以用配准的方法将这些在不同坐标系下的patch合并到一起,构成一个完整的网格mesh。

注意,我们为什么一定要求是三角形带呢,而不是共有一个点呢,因为只有三角形才能构成一个平面,而点即使重合,也能够旋转,所以这里一定要求是三角形带。

到底什么是配准?

配置的目的是将不同视图下的数据,也可以说成不同坐标系下的数据,合并到同一个视图,或则坐标系下,假设我们有M个视图下的数据,那么配准算法将能得到M个旋转和平移矩阵,使得这M的数据源能够很好的合并,这里的代价函数一般是,不同视图下的共有点对之间的距离平方和最小。

registration_outdoor

 

registration_closeup

由上图可以看见,来自二份不同视角的点云数据合并成一份点云数据后,其细节能加的凸显。

一般情况下,配准有二个步骤:

1. 找到不同视图下的对应点;

2. 计算旋转和平移矩阵;

正由于,我们相邻patch之间也有共有三角形带,也就是说包含共有的点对,所以我们可以通过配准的方式将某节点下子节点构成的patch合并成父节点一个大的patch,以此回溯,就能得到插值的结果。

何谓融合(blending)?

因为不同patch之间的配准在计算旋转,平移矩阵时,或多或少都会带来误差,所以在共有的三角形带之间并不能很好的衔接,容易出现塌陷的效果,所以我们需要blending的过程使塌陷的现象消失,这个优化过程,我这里不详细解释,具体看论文。

该代码我已经放在github上了,可以查看以下链接:

https://github.com/baiyang/multi-scale-geometry-interpolation

引用:

http://pointclouds.org/

T.Winkler论文 Multi-Scale Geometry Interpolation.

posted @ 2013-05-24 15:46  把酒泯恩仇  阅读(1769)  评论(9编辑  收藏  举报