Recursive Interlocking Puzzles 论文笔记

论文题目:Recursive interlocking puzzles

声明:文中所有观点仅代表个人见解,若有不妥之处欢迎指正。

这篇论文于2012年 被 SCI 1区 "ACM TRANSACTIONS ON GRAPHICS"录用。

目录

1. Overview

2.Method

2.1 Step 1: 确定Pi(key piece)

   (1) 选择一个seed voxel作为key piece构建的基石

 (2)计算体素的可访问性

 (3)确保key piece 的阻塞性和可移动性

 (4)扩展key piece

 (5)确定key piece

 2.2 Step 2: 确定Pi+1

 (1)候选seed voxel 

 (2)构建初始Pi+1

 (3)确保局部联锁

 (4)扩展Pi+1(同2.1)

 (5)确定Pi+1(同2.1)


 

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!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值