论文题目:Recursive interlocking puzzles
声明:文中所有观点仅代表个人见解,若有不妥之处欢迎指正。
这篇论文于2012年 被 SCI 1区 "ACM TRANSACTIONS ON GRAPHICS"录用。
目录
(1) 选择一个seed voxel作为key piece构建的基石
1. Overview
recursive interlocking:只能按照固定的顺序,一块一块拼图移除,若前一个拼图没有移除,则后一个无法移除
在本文方法,每一步中唯一可以移动的拼图叫做key piece
S → [P1, R1] → [P1, P2, R2] → ... → [P1, ...Pn, Rn] .
(a) 模型体素化,并作为输入S
(b)确定key piece P1(首先移除的拼图), 剩下的体积为R1 --- [P1,R1]
(c)从R1中找到下一个key piece P2,剩下体积为R2 --- [P1,P2,R2]
(d)以此类推,直到将模型所有部分都移除
2.Method
Declaration:拼图只能沿着唯一方向平移移除,一旦进行平移,就认为该块拼图已经完全移除。
整个方法可以分为两步,第一步确定Pi,就是每一步中的key piece,第二步确定Pi+1,就是下一步的key piece. 通过recursive interlocking的规则,可以总结出Pi及Pi+1 的特点:
Pi: 能够第一个被移除;只能从一个方向被移除;simply connected (整个模型在拼图移除前后都是单联通的)
Pi+1:Pi没有移除时,Pi+1不能移动,且Pi+1与Pi不能同时移动;Pi移除后,Pi+1可以移除;Pi+1与R+1也需要是simply connected
2.1 Step 1: 确定Pi(key piece)
(1) 选择一个seed voxel作为key piece构建的基石
识别模型中的体素,有且只有两个面是模型外表面,且其一的面法向竖直向上(如上图粉色体素),这些体素作为seed voxel的候选,从中随机/根据用户喜好选择一个作为seed voxel。
面法向竖直向上 原因:由于一般情况下,模型都是竖直放置的,所以将key piece的默认移动方向认定为竖直向上,这样在没有移除key piece时,模型更加稳定。
(2)计算体素的可访问性
因为确定Pi后,剩下的体积需simply connected,为了减小确定key piece之后剩余体积被分割成多个部分的可能性,这里计算体素的可访问性(即递归地计算体素地邻居体素地个数)。若邻居体素越少,可访问性越小,越不好访问,越容易被碎片化(分割开)(这一类体素大多是边界体素,如下图红色越深,可访问性越低)。所以在构建key piece时,优先将可访问性低地体素包含进去。
(3)确保key piece 的阻塞性和可移动性
阻塞性指阻碍剩余体积(Ri)的移动
首先识别seed voxel两个外表面中,除法向竖直向上以外的另一个面的法向vn,然后广度优先搜索Nb1个体素对。(体素对中,vn正向一侧的是blocking体素,反向的是blockee体素。)从Nb1个体素对中选择Nb2个体素对,其blockee体素的可访问性最小。
然后按照三个策略构建key piece:
①阻碍key piece沿着vn方向移动(因为默认移动方向是竖直方向,为保持这一唯一可移动方向),计算从seed voxel到blockee voxel的最短路径,注意不能穿过blocking voxel及其下方体素(利用blocking voxel 阻碍key piece沿vn方向的移动)然后将选择的路径上的所有体素都添加到key piece中。
②为了确保key piece能够竖直向上移动,将所选择的路径上方的所有体素都添加进来。
到此为止,我们就得到了不能沿vn移动,可以沿竖直向上移动的key piece.
③一开始的seed voxel只有两个可移动方向,但是在田家庵提速的过程中,就会导致出现其他的可移动方向,但我们还要保证key piece只能沿唯一方向移动。
识别anchor 体素(下图中A,对于多个方向存在多个anchor):沿着最初被阻塞的方向(一开始不能被移动的方向)到seed voxel最远且直接连接的体素。
如果anchor体素始终保持在剩余部分,不添加到key piece中,就可以保证key piece在被阻塞的方向上始终都是不可移动的。(下图所示为二维示意图)
(4)扩展key piece
为了平衡拼图之间的尺寸(所包含的体素个数)
对构建的key piece,识别它的anchor voxel,然后识别待添加的体素的候选集{ui},这些待添加的体素在key piece的旁边,且不在anchor voxel 的位置或其上方。并且候选集中的体素,要识别其上方的体素(因为该体素被添加,其上方的体素也需要被添加,才能保证竖直向上可移动)。计算ui中每个体素及其上方体素的可访问性,然后将这个值作为体素被选择的概率,从ui中选择可访问性更低的m个体素。当key piece中的体素个数够了,就将剩下的体素从ui中移除。
N为模型体素化后的所有体素数量;K为拼图数量
(5)确定key piece
这是得到的key piece符合了所有要求,但之前提到,Pi, Pi+1, Ri+1, 其中Pi+1,Ri+1都要求是simply conneted。以下图为例,P1已经确定,P2尚未确定,为确保R2是simply connected, 将Pi紧挨的体素记为Rs,判断R2是否能访问到所有Rs,若不能,就说明不是simply connected。
2.2 Step 2: 确定Pi+1
(1)候选seed voxel
也是从seed voxel开始,di是Pi的移动方向。因为Pi+1是由Pi阻碍无法移动,所以Pi+1至少有一个体素在Pi旁边。且每一移动只能移动一个拼图,所以Pi+1和Pi的移动方向是不同的。
所以这里选取的候选seed voxel是挨在Pi旁边的,且连接面的法向与di垂直
为了减少候选体素的数量减少到10个,遵循以下标准:较小的可访问性;更小的路径最远距离(这是因为距离越短,涉及到的体素越少,在构建拼图时,初始的体素越少,之后建立时灵活性越高)
(2)构建初始Pi+1
对于每一个候选seed voxel,识别其沿着di+1方向上的所有体素,然后确定一条从seed voxel连接到这些体素的最短路径,然后为了使之能够在di+1方向移动,添加其余所需体素。确定路径后,计算这些候选体素的可访问性的和,选取最小的,就是初始Pi+1。
(3)确保局部联锁
现在已经确定Pi+1可以在di+1方向上移动,接下来要确保其在其他五个方向上不能移动:
这里局部联锁指的是当Pi和Ri+1存在的时候,Pi+1不可移动;Pi+1不能和Pi一起移动。
为满足局部联锁,这里需要对这五个方向每个都进行是否可移动的检查(如果Ri+1或Pi有任何一个体素在d方向上挨着Pi+1,那么Pi+1就不能移动)。
(4)扩展Pi+1(同2.1)
(5)确定Pi+1(同2.1)
实验部分及结论部分参照论文,不做赘述。
Thanks for reading!