1.本技术涉及计算机技术领域,尤其涉及一种对象处理方法、装置、设备及计算机可读存储介质。
背景技术:2.多边形模型是计算机图形中最流行、最重要,且得到最广泛支持的模型表示方法。而二维装箱的基本过程是:依次将每个多边形按照某种规则放入容器;每次放入之后更新容器的可放置区域,然后再放置下一个多边形,直到所有多边形已放入或者容器已满。图1a给出了装箱过程的一个中间状态,其中左侧是尚未放置的多边形,右侧是已被放置好的多边形以及容器的剩余空间。装箱问题不仅在学术界得到了广泛应用,其成果在工业界也得到了大量应用。相关技术提供的装箱算法在得到装箱结果之后,往往会存在较大的空隙,导致装箱结果的填充率较低。
技术实现要素:3.本技术实施例提供一种对象处理方法、装置及计算机可读存储介质,能够提高目标容器中资源对象的填充率。
4.本技术实施例的技术方案是这样实现的:本技术实施例提供一种对象处理方法,包括:将待处理的多个资源对象添加到目标容器,得到初始填充结果;基于所述初始填充结果确定所述目标容器中的第一目标可用空间,并基于所述第一目标可用空间从所述多个资源对象中确定第一目标对象;将所述第一目标对象移动至所述第一目标可用空间,并基于所述第一目标可用空间对所述第一目标对象进行放大处理,得到放大后的第一目标对象;确定所述目标容器中的第二目标可用空间和第二目标对象,直至从所述多个资源对象中无法确定出可移动的目标对象。
5.本技术实施例提供一种对象处理装置,包括:对象填充模块,用于将待处理的多个资源对象添加到目标容器,得到初始填充结果;第一确定模块,用于基于所述初始填充结果确定所述目标容器中的第一目标可用空间,并基于所述第一目标可用空间从所述多个资源对象中确定第一目标对象;第一放大模块,用于将所述第一目标对象移动至所述第一目标可用空间,并基于所述第一目标可用空间对所述第一目标对象进行放大处理,得到放大后的第一目标对象;第二确定模块,用于确定所述目标容器中的第二目标可用空间和第二目标对象,直至从所述多个资源对象中无法确定出可移动的目标对象。
6.本技术实施例提供一种装置,包括:存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本技术实施例提供的对象处理方法。
7.本技术实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本技术实施例提供的对象处理方法。
8.本技术实施例提供一种计算机程序产品,包括计算机程序或指令,所述计算机程序或指令被处理器执行时实现本技术实施例提供的对象处理方法。
9.本技术实施例具有以下有益效果:在进行装箱处理时,首先将待处理的多个资源对象添加到目标容器,得到初始填充结果,然后基于所述初始填充结果确定所述目标容器中的第一目标可用空间,也即目标空隙,之后基于所述第一目标可用空间从所述多个资源对象中确定第一目标对象,将所述第一目标对象移动至所述第一目标可用空间,第一目标对象占用的空间是小于第一目标可用空间的,所以在将第一目标对象移动至第一目标可用空间后,可以进一步基于所述第一目标可用空间对所述第一目标对象进行放大处理,得到放大后的第一目标对象,以使得放大后的第一目标对象尽可能占满第一目标可用空间,这样,第一目标对象在移动之前所占的空间会空余出来,但是由于第一目标对象占用的空间是小于第一目标可用空间的,所以目标容器的空余空间相较于移动之前是减少的,之后再进行迭代处理确定所述目标容器中的第二目标可用空间和第二目标对象,直至从所述多个资源对象中无法确定出可移动的目标对象,从而能够对目标容器的填充结果进行全局优化,并且最大限度的减少空余空间,提高目标容器的填充率。
附图说明
10.图1a为装箱问题的示意图;图1b为多边形的坐标轴对齐包围盒和紧致包围盒的对比示意图;图1c为不同类型的site所对应的维诺图示意图;图2是本技术实施例提供的对象处理系统100的架构示意图;图3是本技术实施例提供的第二终端400的结构示意图;图4是本技术实施例提供的对象处理方法的一种实现流程示意图;图5是本技术实施例提供的从所述多个资源对象中确定第一目标对象的实现流程示意图;图6是本技术实施例提供的将所述第一目标对象移动至第一目标可用空间的实现流程示意图;图7是本技术实施例提供的需要预计算的uv岛特征示意图;图8是本技术实施例提供的对象处理方法的装箱结果示意图;图9是本技术实施例提供的计算最大空隙的实现过程示意图;图10是本技术实施例提供的确定最适合移动的uv岛的实现流程示意图;图11是本技术实施例提供的对象方法的优化效果对比图。
具体实施方式
11.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进
一步地详细描述,所描述的实施例不应视为对本技术的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
12.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
13.在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本技术实施例能够以除了在这里图示或描述的以外的顺序实施。
14.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
15.对本技术实施例进行进一步详细说明之前,对本技术实施例中涉及的名词和术语进行说明,本技术实施例中涉及的名词和术语适用于如下的解释。
16.1)装箱问题(packing problem),一般意义上的装箱问题是指将一组规则或者不规则的二维或者三维物体,按照某种规则排列在一个给定的规则或者不规则容器中,从而达到特定目的。本技术实施例所涉及的装箱问题聚焦于将二维不规则多边形装箱在一个二维容器中,如图1a所示。在美术制作术语中,也将待装箱的二维不规则多边形称为uv岛。
17.2)非拟合多边形(nfp,no fit polygon),是指一个多边形b沿着另外一个多边形a的内壁进行滑动时,其边界上的某个参考点的轨迹所形成的多边形。nfp定义了对多边形b在多边形a所定义的区域内进行装箱时,该参考点被放置的可行区域。
18.3)闵可夫斯基和(minkowski sum),给定向量集合a和b,定义它们的闵可夫斯基和为。
19.4)遗传算法(gm,genetic algorithm),是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。
20.5)粒子群算法(pso,particle swarm optimization),是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。它通过对动物社会行为的观察,发现在群体中对信息的社会共享提供一个演化的优势,并以此作为开发算法的基础。
21.6)布尔运算 (boolean operations),给定二维多边形和q,定义如下5种布尔运算:
①
交:将和的相交区域保留,去除其余部分,其形式化表示为;
②
并:将和合并为一个新区域,其形式化表示为;
③
差:从中去除和相交的部分,其形式化表示为;
④
对称差:将和合并成为一个新区域,但是去除两者相交的部分,其形式化表示为;
⑤
补:给定所属的全集,的补就是中不属于的部分,其形式化表示为。
22.7)uv岛的补集,即uv岛所对应的多边形相对于纹理空间这个全集的补。
23.8)包围盒(bounding box),是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。
24.9)坐标轴对齐包围盒 (axis-aligned bounding box, aabb)(二维),由几何体中所有元素的坐标范围所确定的矩形。该包围盒是所有和坐标轴平行或者垂直的矩形中,能够恰好包住该集合体的最小矩形,如图1b中左侧表示的矩形111所示。
25.10)紧致包围盒(obb,optimal bounding box)(二维):在所有可以包住几何体的矩形中面积最小的矩形,如图1b中右侧的矩形112所示。
26.11)空间搜索树(aabb tree):一种基于k-d树原理实现的空间搜索树,其每个节点代表一个三维几何图元的空间包围盒。该数据结构可以快速报告查询图元是否与树中的图元相交,以及具体的相交类型、相交位置等。
27.12)维诺图(voronoi diagram):又叫泰森多边形,由一组连接相邻site的垂直平分线组成的连续多边形构成。
28.13)德劳内图( delaunay graph):是维诺图的对偶图,对于site是点的情形,也叫德劳内图的三角剖分(delaunay triangulation)。
29.14)维诺图线段(voronoi segments),可以将site由点推广到线段、多边形等,形成线段和多边形的维诺图,如图1c所示,121为site为点的图元所对应的维诺图,122为site为线段的图元所对应的维诺图,其中非加粗线段记为维诺图线段;123为site为多边形的图元所对应的维诺图,同样的,123中的非加粗线段为维诺图线段。在本技术实施例中,主要关注site为多边形的图元所对应的维诺图。
30.15)最大扩展obb(maximum extensible obb):对于一条维诺图线段,在它所在的局部空隙中可以形成的最大矩形称之为最大扩展obb。
31.16)移动uv岛:即对uv岛的位置进行移动的过程。
32.为了更好地理解本技术实施例提供的装箱优化方法,首先对相关技术中的装箱算法进行说明。
33.在相关技术中,常用的装箱算法有基于nfp和最低重心方法,在实现时,依次为每个待放置的多边形确定多个候选角度以及依据候选角度确定多个候选位置,按照重心最大的候选位置放置相应多边形。在实践研究中发现,按照这种装箱方法放置后,容器中会存在较大空隙,因此填充率较低。
34.基于此,本技术实施例提供一种对象处理方法、装置、设备和计算机可读存储介质,能够缩小容器中的缝隙,从而提高填充率,下面说明本技术实施例提供的计算机设备的示例性应用,本技术实施例提供的设备可以实施为笔记本电脑,平板电脑,台式计算机,机顶盒,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式
游戏设备)等各种类型的用户终端,也可以实施为服务器。下面,将说明设备实施为终端时示例性应用。
35.参见图2,图2是本技术实施例提供的对象处理系统100的架构示意图,如图2所示,该系统包括第一终端200、网络300和第二终端400,其中,第一终端200和第二终端400通过网络建立有通信连接,网络300可以是广域网或者局域网,又或者是二者的组合。
36.用户可以利用第一终端200完成虚拟对象的三维模型设计,该虚拟对象可以是游戏场景中的虚拟对象,还可以是虚拟现实场景或者增强现实场景中的虚拟对象,例如可以是虚拟人物,虚拟建筑物,以及虚拟植物等,而显示在虚拟场景中的虚拟对象是通过纹理映射技术(texture mapping)对该虚拟对象的三维模型进行纹理贴图后得到的,从而可提升显示在游戏画面中的虚拟对象的真实性和生动性。在本技术实施例中,第一终端200在完成对虚拟对象的三维模型设计后,将三维模型数据发送至第二终端400,第二终端400可以对虚拟对象的三维模型进行面片剖分,得到二维的资源对象(在一些实施例中,可以称为uv岛或者多边形),然后再对二维的资源对象进行装箱处理。在实现时可以按照预设的装箱算法对二维的资源对象进行装箱处理,从而得到装箱结果(对应其他实施例中的初始填充结果),在本技术实施例中,可以对得到的装箱结果进行进一步的全局优化,首先确定出初始填充结果中的最大空隙,然后再从多个资源对象中确定第一目标对象,其中第一目标对象占用的空间略小于该最大空隙,然后将第一目标对象移动至该最大空隙,并对第一目标对象进行放大处理,使得放大后的第一目标对象尽可能的填满该最大空隙,如此进行迭代,确定所述目标容器中的第二目标可用空间和第二目标对象,直至从所述多个资源对象中无法确定出可移动的目标对象,由于第一目标对象占用的空间小于该最大空隙,并且将第一目标对象移动之后进行了放大处理,从而使得容器的总空余空间变小,提升填充率。
37.在一些实施例中,第一终端200和第二终端400可以是同一个终端,也即通过同一个终端完成对象设计和纹理渲染功能。在一些实施例中,第二终端400还可以是从服务器中获取待渲染的虚拟三维虚拟对象,然后第二终端400对三维虚拟对象进行面片剖分,得到多个二维的资源对象,并将多个资源对象进行装箱处理以及全局优化处理,从而提高填充率。
38.这里的服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、cdn、以及大数据和人工智能平台等基础云计算服务的云服务器。第一终端200和第二终端400可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表、车载智能终端等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本技术实施例中不做限制。
39.参见图3,图3是本技术实施例提供的第二终端400的结构示意图,图3所示的第二终端400包括:至少一个处理器410、存储器450、至少一个网络接口420和用户接口430。终端400中的各个组件通过总线系统440耦合在一起。可理解,总线系统440用于实现这些组件之间的连接通信。总线系统440除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图3中将各种总线都标为总线系统440。
40.处理器410可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(dsp,digital signal processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理
器等。
41.用户接口430包括使得能够呈现媒体内容的一个或多个输出装置431,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口430还包括一个或多个输入装置432,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
42.存储器450可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器450可选地包括在物理位置上远离处理器410的一个或多个存储设备。
43.存储器450包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(rom,read only memory),易失性存储器可以是随机存取存储器(ram,random access memory)。本技术实施例描述的存储器450旨在包括任意适合类型的存储器。
44.在一些实施例中,存储器450能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
45.操作系统451,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;网络通信模块452,用于经由一个或多个(有线或无线)网络接口420到达其他计算设备,示例性的网络接口420包括:蓝牙、无线相容性认证(wifi)、和通用串行总线(usb,universal serial bus)等;呈现模块453,用于经由一个或多个与用户接口430相关联的输出装置431(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);输入处理模块454,用于对一个或多个来自一个或多个输入装置432之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
46.在一些实施例中,本技术实施例提供的装置可以采用软件方式实现,图3示出了存储在存储器450中的对象处理装置455,其可以是程序和插件等形式的软件,包括以下软件模块:对象填充模块4551、第一确定模块4552、第一放大模块4553和第二确定模块4554,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
47.在另一些实施例中,本技术实施例提供的装置可以采用硬件方式实现,作为示例,本技术实施例提供的装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本技术实施例提供的对象处理方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(asic,application specific integrated circuit)、dsp、可编程逻辑器件(pld,programmable logic device)、复杂可编程逻辑器件(cpld,complex programmable logic device)、现场可编程门阵列(fpga,field-programmable gate array)或其他电子元件。
48.将结合本技术实施例提供的终端的示例性应用和实施,说明本技术实施例提供的对象处理方法。
49.参见图4,图4是本技术实施例提供的对象处理方法的一种实现流程示意图,将结
合图4示出的步骤进行说明。
50.步骤s101,将待处理的多个资源对象添加到目标容器,得到初始填充结果。
51.这里,多个资源对象可以是指两个或两个以上资源对象,在本技术实施例中,资源对象可以是对虚拟对象的三维模型进行剖分得到的二维多边形(下述简称为多边形),该多边形可以是带孔洞的多边形,也可以是不带孔洞的多边形。在一些实施例中,该资源对象可以是游戏制作行业中的uv岛,其中,uv岛的本质即为上述的多边形。另外,该资源对象还可以是对实际对象进行展开及分块处理后得到。目标容器用于承载资源对象,该目标容器也可以为形状为多边形的二维物体。
52.在实际应用过程中,作为示例,可以利用预设的装箱算法,将待处理的多个资源对象依次添加到目标容器,从而得到初始填充结果。例如可以利用基于nfp+遗传算法的装箱算法、基于nfp和最低重心原则的自动装箱算法等等。初始填充结果,在一些实施例中,也可以称为装箱结果。初始填充结果可以包括各个资源对象的中心点所在的位置,还可以包括各个资源对象的外轮廓顶点的位置信息、目标容器的空余位置等。
53.步骤s102,基于初始填充结果确定目标容器中的第一目标可用空间,并基于第一目标可用空间从多个资源对象中确定第一目标对象。
54.目标容器中的可用空间可以理解为未被资源对象占用的空间,在一些实施例中,也可以称为空隙。在本技术实施例中,第一目标可用空间为目标容器中的最大空隙。在实际实现过程中,可以基于初始填充结果确定该目标容器中各个资源对象的外轮廓信息,在得到各个资源对象的外轮廓信息后,也就能确定出目标容器中各个可用空间的轮廓信息,然后构建各个可用空间的维诺图,基于该维诺图确定出目标容器中的最大空隙,也即第一目标可用空间。在确定出第一目标可用空间后,需要从多个资源对象中选择出占用空间小于第一目标可用空间,但又相差不大的第一目标对象。在确定第一目标对象时,需要满足第一目标对象的缩放比例大于一定的比例阈值,但是又是大于该比例阈值中最小比例对应的资源对象,如此能够保证空余空间变小,但是资源对象的放大比例不会过大,从而保证各个资源对象均匀放大,避免失真。
55.步骤s103,将第一目标对象移动至第一目标可用空间,并基于第一目标可用空间对第一目标对象进行放大处理,得到放大后的第一目标对象。
56.在实际实现过程中,可以将第一目标对象的中心点移动至第一目标可用空间的中心点,然后再旋转第一目标对象,使得第一目标对象全部处于第一目标可用空间内,然后再对第一目标对象进行放大处理,使得第一目标对象在不超出第一目标可用空间范围内的情况下尽可能放大。由于第一目标对象的占用空间小于第一目标可用空间,将第一目标对象移动至第一目标可用空间,并进行放大处理后,可以使得目标容器的空余空间变小,从而能够提高目标容器的填充率。
57.步骤s104,确定目标容器中的第二目标可用空间和第二目标对象,直至从多个资源对象中无法确定出可移动的目标对象。
58.在将第一目标对象移动至第一目标可用空间之后,迭代执行上述步骤,从目标容器中确定最大的第二目标可用空间,以及移动至第二目标可用空间的第二目标对象,并将第二目标对象移动至第二目标可用空间之后,对第二目标对象进行放大处理,进一步缩小目标容器的可用空间,提升填充率,直至无法从资源对象中确定出可移动的目标对象,如此
就完成了对目标容器的全局优化。
59.在本技术实施例提供的对象处理方法中,首先将待处理的多个资源对象添加到目标容器,得到初始填充结果,然后基于所述初始填充结果确定所述目标容器中的第一目标可用空间,也即目标空隙,之后基于所述第一目标可用空间从所述多个资源对象中确定第一目标对象,将所述第一目标对象移动至所述第一目标可用空间,第一目标对象占用的空间是小于第一目标可用空间的,所以在将第一目标对象移动至第一目标可用空间后,可以进一步基于所述第一目标可用空间对所述第一目标对象进行放大处理,得到放大后的第一目标对象,以使得放大后的第一目标对象尽可能占满第一目标可用空间,这样,第一目标对象在移动之前所占的空间会空余出来,但是由于第一目标对象占用的空间是小于第一目标可用空间的,所以目标容器的空余空间相较于移动之前是减少的,之后再进行迭代处理,确定所述目标容器中的第二目标可用空间和第二目标对象,直至从所述多个资源对象中无法确定出可移动的目标对象,从而能够对目标容器的填充结果进行全局优化,并且最大限度的减少空余空间,提高目标容器的填充率,进而提高计算机设备的内存利用率,并且由于目标容器的填充率提高,资源对象进行了扩大处理,从而能够提高进行纹理映射的分辨率。
60.在一些实施例中,在步骤s101之后,还可以通过下述的步骤s201至步骤s201至步骤s204确定不同资源对象之间的包含关系,以下对各个步骤进行说明。
61.步骤s201,获取第i个资源对象的各个孔洞信息。
62.i=1,2,
…
,n,n为资源对象总数,且n为资源对象总数。在本技术实施例中,资源对象可以是二维多边形,当一个二维多边形内部包含有其他多边形时,被包含的多边形可以称为是该二维多边形的孔洞。资源对象的各个孔洞信息可以包括孔洞上的各个顶点名称、顶点位置以及顶点之间的连接关系。
63.步骤s202,从第j个资源对象的外边界上随机确定一个参考点,确定所述参考点是否位于第i个资源对象中的孔洞内部。
64.其中,参考点为位于第j个资源对象外边界上的随机一个点。j=1,2,
…
,n,且i不等于j。作为示例,可以利用cgal提供的库函数检查该参考点是否在第i个资源对象中的孔洞内部。其中,在实现时,是依次判断该参考点是否位于第i个资源对象中的各个孔洞内部,如果该参考点不位于第i个资源对象中所有孔洞内部,那么确定该参考点不位于第i个资源对象中的孔洞内部,此时进入步骤s204;如果该参考点位于第i个资源对象中某个孔洞内部,则确定该参考点位于第i个资源对象中孔洞内部,此时进入步骤s203。
65.步骤s203,确定所述第i个资源对象包含所述第j个资源对象,更新第i个资源对象和第j个资源对象的包含关系信息。
66.在本技术实施例中,每个资源对象的包含关系信息可以包括第一对象集合和第二对象集合,其中,第一对象集合中包括的是该资源对象所包含的资源对象的对象标识,第二对象集合中包括的是包含该资源对象的其他资源对象的对象标识。如果确定第i个资源对象包含第j个资源对象,那么需要将第j个资源对象的对象标识增加至第i个资源对象的第一对象集合中,并将第i个资源对象的对象标识增加至第j个资源对象的第二对象集合中。
67.步骤s204,确定所述第i个资源对象不包含所述第j个资源对象。
68.由于在针对某些应用的装箱问题中,得到的初始填充结果中可以会有一些资源对象处在另外一些资源对象的孔洞中,此时如果需要移动的资源对象中包含有其他资源对象
时,需要将该资源对象孔洞中包含的其他资源对象进行同步移动,因此在对装箱优化之前,可以利用上述的步骤s201至步骤s204,确定不同资源对象之间的包含关系,从而在装箱结果优化时,能够基于资源对象的包含关系实现具有包含关系的资源对象的同步移动,提高优化效率。
69.在一些实施例中,还可以通过下述的步骤s211至步骤s217确定资源对象的姿态信息,该姿态信息能够表征资源对象是否处于横平竖直状态,以下对各个步骤进行说明。
70.步骤s211,获取第i个资源对象包含的各个线段和所述各个线段的长度。
71.步骤s212,基于所述各个线段的端点信息确定目标线段。
72.其中,该目标线段的两个端点在水平方向的第一坐标差值小于预设的差值阈值,或者所述目标线段的两个端点在竖直方向的第二坐标差值小于所述差值阈值。当目标线段的两个端点在水平方向的第一坐标差值小于差值阈值时,说明目标线段基本处于水平姿态,当目标线段的两个端点在竖直方向的第二坐标差值小于差值阈值时,说明目标线段基本处于竖直姿态。
73.步骤s213,基于所述各个线段的长度确定所述第i个资源对象的第一总长度。
74.在实现时,将各个线段的长度进行求和即得到第i个资源对象的第一总长度。
75.步骤s214,基于目标线段的长度确定所述第i个资源对象的第二总长度。
76.在实现时,将各个目标线段的长度进行求和即可得到第i个资源对象的第二总长度。
77.步骤s215,判断第一总长度与第一总长度的比值是否大于预设的比值阈值。
78.其中,如果所述第二总长度与所述第一总长度的比值大于预设的比值阈值,进入步骤s216;如果该比值小于或者等于该比值阈值,进入步骤s217。
79.步骤s216,确定所述第i个资源对象的姿态信息为第一姿态。
80.当第二总长度与第一总长度的比值大于该比值阈值,说明第i个资源对象中有较大部分的线段为水平状态或者竖直状态,那么此时确定第i个姿态对象的姿态信息为第一姿态,其中,第一姿态表征第i个资源对象为横平竖直姿态。
81.步骤s217,确定所述第i个资源对象的姿态信息为第二姿态。
82.当第二总长度与第一总长度的比值小于或者等于该比值阈值,说明第i个资源对象中有较小部分的线段为水平状态或者竖直状态,那么此时确定第i个姿态对象的姿态信息为第二姿态,其中,第一姿态表征第i个资源对象为非横平竖直姿态。
83.通过上述步骤s211至步骤s217,能够确定出各个资源对象的姿态信息,通过资源对象的姿态信息能够表征资源对象是否处于横平竖直状态,由于在某些应用场景中,对于处于横平竖直姿态的资源对象来说,在位置优化的过程中需要保持该姿态特性。在这种情况下,以横平竖直线段为主的资源对象在位置优化的过程中,只允许旋转90
°
的整数倍。因此,需要通过上述步骤s211至步骤s217确定出资源对象的姿态信息,并保存下来供后续算法确定旋转角度提供参考。
84.在一些实施例中,上述步骤s102中的“基于所述初始填充结果确定所述目标容器中的第一目标可用空间”可以通过下述的步骤s1021至步骤s1024实现,以下对各个步骤进行说明。
85.步骤s1021,获取所述多个资源对象的外轮廓信息,并基于所述初始填充结果确定
所述多个资源对象的外轮廓信息相对于所述目标容器的补集空间。
86.获取资源对象的外轮廓信息,在实现时,可以首先获取资源对象上的每条边,以及各条边的两个相邻面,然后判断各条边的相邻面是否均属于资源对象内部,如果一条边的相邻面均属于资源对象内部,则确定该条边为内部边,否则确定该条边为外边界,将一个资源对象的各个外边界连接起来,就构成了该资源对象的外轮廓。各个资源对象的外轮廓不仅能够表征资源对象在目标容器中占用的位置、空间,在已知目标容器的位置信息和放置在该目标容器内的各个资源对象的外轮廓信息的情况下,利用cgal提供的确定补集空间的库函数就能确定出多个资源对象的外轮廓信息相对于所述目标容器的补集空间。该补集空间表征目标容器中未被资源对象占用的空间。
87.步骤s1022,确定所述补集空间的维诺图,并获取所述维诺图中的各个维诺图线段。
88.在实际实现时,可以利用cgal提供的确定维诺图的库函数,来确定补集空间的维诺图,在确定出补集空间的维诺图后,获取构成该维诺图的线段也就得到了各个维诺图线段。
89.步骤s1023,确定所述各个维诺图线段对应的维诺包围盒。
90.作为示例,可以采用空间搜索树的方法,确定各个维诺图线段所对应的维诺包围盒,在本技术实施例中,该维诺包围盒可以是最大扩展包围盒。在实际应用过程中,可以首先沿着当前维诺图线段s的垂直方向,分别朝上和朝下发射射线,然后分别计算朝上和朝下射线的最短交点,并记录交点到s的距离a和b;然后构造通过s的中点、垂直于s并且朝上和朝下长度分别为a和b的线段t;沿着线段t的垂直方向(即s所在直线的方向),分别朝左和朝右发射射线,然后计算这两条射线的最短交点,并记录它们到t的距离c和d;最后以s的中点为基准,构造朝上、下、左、右四个方向长度分别为a,b,c,d的矩形,该矩形即为当前维诺图线段s所对应的最大扩展obb。
91.步骤s1024,将面积最大的维诺包围盒确定为所述目标容器中的第一目标可用空间。
92.由于维诺图包围盒为矩形包围盒,并且在步骤s1023确定维诺图线段的维诺图包围盒时,该维诺图包围盒相邻的两条边的长度分别为(a+b)和(c+d),因此可以得出该维诺图包围盒的面积为(a+b)*(c+d)。因为在得到各个维诺图线段的维诺包围盒时,可以基于维诺图包围盒的相邻两条边的长度确定出维诺图包围盒的面积。在步骤s1024中,将面积最大的维诺包围盒确定为所述目标容器中的第一目标可用空间。
93.在一些实施例中,上述步骤s102中的“基于所述第一目标可用空间从所述多个资源对象中确定第一目标对象”可以通过图5所示的步骤s301至步骤s311实现,以下结合图5对各个步骤进行说明。
94.步骤s301,确定所述第一目标可用空间对应维诺包围盒的姿态信息。
95.由于维诺包围盒的相邻的两个边,其中一个是垂直于维诺包围盒对应的维诺图线段的,一个是平行于维诺包围盒对应的维诺图线段的,那么确定第一目标可用空间对应的维诺包围盒的姿态信息,在实现时,可以通过确定该维诺包围盒对应的维诺图线段的姿态来实现,其中,如果该维诺图线段的两个端点在水平方向上的坐标差值小于预设的差值阈值,或者该维诺图线段的两个端点在竖直方向上的坐标差值小于预设的差值阈值,说明该
维诺图线段是水平或者竖直的,那么对应地,维诺包围盒的姿态为第一姿态,也即第一姿态为横平竖直的姿态。
96.步骤s302,确定该维诺包围盒是否处于第一姿态。
97.其中,如果该维诺包围盒处于第一姿态,进入步骤s303,优先选择也同样处于第一姿态的资源对象作为第一候选对象;如果该维诺包围盒处于第二姿态,进入步骤s307,则选择处于第二姿态的资源对象作为第二候选对象。
98.步骤s303,确定多个资源对象中是否存在处于第一姿态的第一候选对象。
99.该步骤在实现时,首先获取各个资源对象的姿态信息和包含关系信息,然后基于所述各个资源对象的姿态信息和包含信息,确定所述多个资源对象中是否存在处于第一姿态且不被其他资源对象包含的第一候选对象,当确定存在至少第一候选对象时,进入步骤s304;当确定不存在第一候选对象时,进入步骤s307。
100.需要说明的是,因为当资源对象被其他对象包含时,严格意义上说并没有占用额外的空间,将该资源对象移动出去后也不会空余出空间,因此在该步骤判断是否存在第一候选对象时,不仅要判断资源对象是否处于第一姿态,还要判断该资源对象是否被其他资源对象包含。
101.步骤s304,确定各个第一候选对象的第一候选包围盒,并基于维诺包围盒确定各个第一候选包围盒对应的第一缩放比例。
102.第一候选包围盒可以为紧致包围盒,也即能将第一候选对象包围住的最小矩形包围盒。在已知各个第一候选对象的第一候选包围盒和维诺包围盒的前提下,可以基于各个第一候选包围盒的长和宽,以及维诺包围盒的长和宽确定出长边对应的长度缩放比例和短边对应的宽度缩放比例,并将长度缩放比例和宽度缩放比例中的较小值确定为该第一候选包围盒的第一缩放比例。
103.步骤s305,确定是否存在至少一个大于预设的比例阈值的第一候选缩放比例。
104.该比例阈值为大于1的实数,当存在至少一个大于预设的比例阈值的第一候选缩放比例时,说明存在占用空间小于第一目标可用空间的第一候选对象,此时进入步骤s306;当不存在大于所述比例阈值的候选缩放比例时,进入步骤s307。
105.步骤s306,将第一候选缩放比例中的最小缩放比例对应的第一候选对象确定为第一目标对象。
106.在实际应用过程中,如果仅仅以大于比例阈值为目标对象的选择条件,算法会陷入死循环或者运行效率过低,因此可以再进一步将大于比例阈值中的最小缩放比例对应的第一候选对象确定为第一目标对象,从而能够在尽量让多个资源对象在位置优化的过程中被均匀扩大,避免少数资源对象大比例扩大而导致大多数资源对象的大小保持不变,进而造成失真。
107.步骤s307,从多个资源对象中确定处于第二姿态的第二候选对象。
108.通过上述的步骤s211至步骤s217已确定出各个资源对象的姿态信息,在该步骤中,将姿态信息为第二姿态的资源对象确定为第二候选对象。
109.步骤s308,确定各个第二候选对象的第二候选包围盒,并基于所述维诺包围盒确定各个第二候选包围盒对应的第二缩放比例。
110.该步骤的实现过程与步骤s304的实现过程是类似的,在实际实现时,可以参考步
骤s304的实现过程。
111.步骤s309,确定是否存在至少一个大于比例阈值的第二候选缩放比例。
112.当存在至少一个大于预设的比例阈值的第二候选缩放比例时,进入步骤s310;当不存在至少一个大于预设的比例阈值的第二候选缩放比例时,进入步骤s311。
113.步骤s310,将所述第二候选缩放比例中的最小缩放比例对应的第二候选对象确定为第一目标对象。
114.步骤s311,确定从所述多个资源对象中无法确定出可移动的目标对象,结束流程。
115.在基于第一目标可用空间从多个资源对象中确定第一目标对象时,通过上述的步骤s301至步骤s311,首先确定出第一目标可用空间对应的维诺包围盒的姿态信息,对于处于第一姿态(横平竖直)的第一目标可用空间,可以优先确定同样处于第一姿态的资源对象作为候选对象,然后再进一步基于候选对象对应的缩放比例,选择大于比例阈值中的最小比例对应的资源对象为第一目标对象,如此不仅能够保证较高的处理效率,还能够使得资源对象能够均匀放大;如果对于处于第一姿态(横平竖直)的第一目标可用空间,没有选择出同样处于第一姿态且缩放比例满足条件的资源对象时,可以从处于第二姿态的资源对象中选择缩放比例满足条件的资源对象,如此可以提高待移动目标对象的命中率;但是对于处于第二姿态的第一目标可用空间来说,只能从同样处于第二姿态的资源对象中选择缩放比例满足条件的第一目标资源对象,而不能从处于第一姿态的资源对象中选择,也就是说处于第一姿态的资源对象只能放置在同样处于第一姿态的可用空间中,从而保证处于横平竖直姿态的资源对象在移动后仍然能够处于横平竖直的姿态;但是处于第二姿态的资源对象可以放置在处于第一姿态的空间中,也可以放置在处于第二姿态的空间中,从而提高待移动目标对象的命中率,从而提高对象处理效率。
116.在一些实施例中,上述步骤s301“确定所述第一目标可用空间对应维诺包围盒的姿态信息”,可以通过下述的步骤s3011至步骤s3015实现,以下对各个步骤进行说明。
117.步骤s3011,获取所述维诺包围盒对应维诺图线段的第一端点的第一坐标信息和第二端点的第二坐标信息。
118.其中,第一坐标信息包括第一端点在水平方向的第一水平坐标值和在竖直方向的第一竖直坐标值;第二坐标信息包括第二端点在水平方向的第二水平坐标值和在竖直方向的第二竖直坐标值。例如,维诺图线段a的第一端点的第一坐标信息为(34,58);第二端点的第二坐标信息可以为(38.2,108)。维诺图线段b的第一端点的第一坐标信息为(58,99),第二端点的第二坐标信息为(58,129)。
119.步骤s3012,基于所述第一坐标信息和所述第二坐标信息,确定所述第一端点和所述第二端点在水平方向的第一坐标差值,确定所述第一端点和所述第二端点在竖直方向的第二坐标差值。
120.作为示例,可以是将第一坐标信息中的第一水平坐标值与第二坐标信息中第二水平坐标值的差值绝对值确定为第一坐标差值;将第一坐标信息中第一竖直坐标值与第二坐标信息中的第二竖直坐标值的差值绝对值确定为第二坐标差值。
121.承接上述举例,维诺图线段a的第一坐标差值为4.2,第二坐标差值为50;维诺图线段b的第一坐标差值为0,第二坐标差值为30。
122.步骤s3013,判断维诺图线段的第一坐标差值或者第二坐标差值是否小于预设的
差值阈值。
123.其中,该差值阈值可以是0,也可以是接近于0的实数,例如可以是0.1、0.05等。当所述第一坐标差值小于预设的差值阈值时,说明维诺图线段的两个端点在水平方向上的坐标几乎是相同的,也即维诺图线段为水平方向的;而当第二坐标差值小于所述差值阈值时,说明维诺图线段在竖直方向上的坐标几乎是相同的,也即维诺图线段是竖直方向的。因此,当第一坐标差值小于该差值阈值,或者当第二坐标差值小于该差值阈值,进入步骤s,014;当第一坐标差值不小于差值阈值,并且所述第二坐标差值不小于所述差值阈值时,进入步骤s3015。
124.步骤s3014,确定所述维诺包围盒的姿态信息为处于第一姿态。
125.步骤s3015,确定所述维诺包围盒的姿态信息为处于第二姿态。
126.由于维诺包围盒的两个相邻边中一条边是平行于维诺包围盒对应的维诺图线段,一条边是垂直于该维诺图线段,因此在上述步骤s3011至步骤s3015中,在确定维诺包围盒的姿态信息时,可以通过确定维诺包围盒对应的维诺图线段中两个端点的第一坐标差值和第二坐标差值来确定维诺图线段的姿态,并利用维诺图线段的姿态确定维诺包围盒的姿态信息,从而为后续确定目标可用空间对应的目标对象提供数据基础。
127.在一些实施例中,上述步骤s304中的“基于所述维诺包围盒确定各个第一候选包围盒对应的第一缩放比例”,可以通过下述的步骤s3041至步骤s3044包括:步骤s3041,获取所述维诺包围盒的第一长度和第一宽度,获取所述第一候选包围盒的第二长度和第二宽度。
128.假设维诺包围盒的第一长度为100,第一宽度为80,第一候选包围盒a的第二长度为50,第二宽度为35,第一候选包围盒b的第二长度为80,第二短度为40;第一候选包围盒c的第二长度为200,第二宽度为120。
129.步骤s3042,将所述第一长度和所述第二长度的商确定为长度缩放比例。
130.第一候选包围盒a的长度缩放比例为2,第一候选包围盒b的长度缩放比例为1.25,第一候选包围盒c的长度缩放比例为0.5。
131.步骤s3043,将所述第一宽度和所述第二宽度的商确定为宽度缩放比例。
132.第一候选包围盒a的宽度缩放比例为2.3,第一候选包围盒b的宽度缩放比例为2,第一候选包围盒c的宽度缩放比例为0.67。
133.步骤s3044,将所述长度缩放比例和所述宽度缩放比例中的较小值确定为所述第一候选包围盒对应的第一缩放比例。
134.承接上述比例,由于第一候选包围盒a的长度缩放比例为2,宽度缩放比例为2.3,取两者中的较小值2,也即第一候选包围盒对应的第一缩放比例为2;第一候选包围盒b的长度缩放比例为1.25,宽度缩放比例为2,取两者中的较小值1.25,也即第一候选包围盒对应的第一缩放比例为1.25;第一候选包围盒c的长度缩放比例为0.5,宽度缩放比例为0.67,取两者中的较小值0.5,也即第一候选包围盒c的缩放比例为0.5。
135.在确定各个第一候选对象的缩放比例时,在上述的步骤s3041至步骤s3044中,需要根据维诺包围盒的尺寸信息以及各个第一候选对象的尺寸信息分别确定出长度缩放比例和宽度缩放比例,并取两者中的较小值为最终的第一缩放比例,如此能够保证在按照第一缩放比例对资源对象进行放大时,不会超出目标可用空间的范围,从而避免资源对象之
间发生重叠。
136.在一些实施例中,上述步骤s103中“将所述第一目标对象移动至所述第一目标可用空间”可以通过如图6所示的步骤s401至步骤s405实现,以下结合图6对各个步骤进行说明。
137.步骤s401,确定目标容器中是否存在第一目标对象的对称对象。
138.其中,当所述目标容器中不存在所述第一目标对象的对称对象时,则只需要移动第一目标对象即可,此时进入步骤s402;当目标容器中存在第一目标对象的对称对象时,需要对第一目标对象以及其对称对象进行相同比例的放大处理,此时进入步骤s411。
139.步骤s402,获取所述第一目标对象的包含关系信息。
140.步骤s403,确定第一目标对象是否包含子资源对象。
141.当所述包含关系信息表征所述第一目标对象中未包含子资源对象时,单独移动第一目标对象即可,此时进入步骤s404,当所述包含关系信息表征所述第一目标对象中包含子资源对象时,需要将第一目标对象和第一目标对象包含的子对象均进行移动,此时进入步骤s406。
142.步骤s404,将所述第一目标对象的第一中心点移动至所述第一目标可用空间的第二中心点。
143.步骤s405,以所述第一中心点为旋转中心,旋转所述第一目标对象,直至所述第一目标对象的包围盒的长边和所述第一目标可用空间对应的维诺包围盒的长边平行。
144.当第一目标对象的包围盒的长边和所述第一目标可用空间对应的维诺包围盒的长边平行时,第一目标对象的包围盒的宽边和第一目标可用空间对应的维诺包围盒的短边也是平行的,如此可以保证第一目标对象的包围盒能够完全位于第一目标可用空间对应维诺包围盒的范围之内,从而也同样能保证对第一目标对象按照第一缩放比例进行缩放之后,第一目标对象以及第一目标对象的包围盒能够完全位于第一目标可用空间对应的维诺包围盒内。
145.在本技术实施例中,在对多个资源对象进行装箱处理,所得到的初始填充结果中,会存在一个资源对象内部还嵌套包含有其他资源对象的情况,也可能存在几个资源对象为对称关系的情况,此时,在将第一目标对象移动至第一目标可用空间时,针对第一目标对象中是否包含有其他子资源对象以及存在与第一目标对象对称的资源对象时有不同的处理方式,以下对第一目标对象中存在子对象以及存在与第一目标对象对称的资源对象时,在步骤s103之后还可以执行图6所示的以下步骤:步骤s406,确定所述第一中心点和所述子资源对象的第三中心点之间的移动向量。
146.第三中心点可以是子资源对象本身的中心点。作为示例,移动向量可以是将第三中心点的第三中心坐标减去第一中心点的第一中心坐标得到的。例如,第一中心坐标为(30,40),第三中心坐标为(40,60),此时移动向量为(10,20)。
147.步骤s407,将所述第一目标对象移动至所述第一目标可用空间,并对所述第一目标对象进行放大处理,得到放大后的第一目标对象。
148.将第一目标对象移动至第一目标可用空间在实现时可以首先将所述第一目标对象的第一中心点移动至所述第一目标可用空间的第二中心点,然后以所述第一中心点为旋
转中心,旋转所述第一目标对象,直至所述第一目标对象的包围盒的长边和所述第一目标可用空间对应的维诺包围盒的长边平行。对第一目标对象进行放大处理,可以是以第一目标对象的第一中心点为放大中心,放大第一目标对象对应的第一缩放比例,从而得到放大后的第一目标对象。
149.步骤s408,获取所述放大后的第一目标对象相对于所述第一目标对象的目标缩放比例和目标旋转角度。
150.这里,目标缩放比例也即第一目标对象的包围盒的第一缩放比例,目标旋转角度为在步骤s407在实现时,将第一目标对象的第一中心点移动至所述第一目标可用空间的第二中心点之后,旋转所述第一目标对象,直至所述第一目标对象的包围盒的长边和所述第一目标可用空间对应的维诺包围盒的长边平行时的旋转角度。
151.步骤s409,利用目标缩放比例和目标旋转角度,对移动向量进行调整,得到调整后的移动向量。
152.在实现时,可以将移动向量按照目标缩放比例进行放大处理,然后再旋转该目标旋转角度,得到调整后的移动向量。
153.假设移动向量为(10,20),目标缩放比例为1.5,目标旋转角度为30
°
,那么首先将移动向量放大1.5倍,得到(15,30),然后再旋转30
°
,得到调整后的移动向量为(0,30)。
154.步骤s410,基于调整后的移动向量、目标缩放比例和目标旋转角度对子资源对象进行移动和放大处理,得到处理后的子资源对象。
155.在实际应用过程中,可以将子资源对象的中心点按照该调整后的移动向量进行移动,然后再将子资源对象按照目标缩放比例进行放大,最后再将放大后的子资源对象以自身的中心点为旋转中心,旋转该目标旋转角度,得到处理后的子资源对象。
156.通过上述的步骤s406至步骤s410,能够在第一目标对象包含其他子资源对象时,在移动第一目标对象之后,基于第一目标对象与子资源对象的相对位置关系和第一目标对象的移动参数、目标旋转角度、目标缩放比例,将第一目标对象中包含的子资源对象进行相应的移动,从而使得第一目标对象与其包含的子资源对象能够保持相同的位置关系。
157.在一些实施例中,确定所述目标容器中存在所述第一目标对象的对称对象时,可以通过下述的步骤s411至步骤s415对第一目标对象及对称对象进行移动和放大:步骤s411,将第一目标对象和对称对象从所述目标容器中移出。
158.步骤s412,确定目标容器的当前可用面积,并确定第一目标对象和对称对象的占用面积。
159.目标容器的当前可用面积可以是目标容器中所有可用面积的总和,假设为s1假设第一目标对象有三个对称对象,第一目标对象的占用面积为s2,那么第一目标对象和对称对象的占用面积为4s2。
160.步骤s413,基于当前可用面积和占用面积,确定第一目标对象和对称对象的放大比例。
161.这里,可以首先确定当前可用面积和占用面积的比值,也即确定s1/4s2,由于第一目标对象和对称对象一般不能将当前可用面积全部占用,因此需要将当前可用面积和占用面积的比值再乘以权重值得到第一目标对象和对称对象的放大比例,该权重值可以为小于1的实数,例如,当前可用面积和占用面积的比值为2,权重值为0.8,那么第一目标对象和对
称对象的放大比例为1.6。
162.步骤s414,基于放大比例对第一目标对象和对称对象进行放大处理,得到放大后的第一目标对象和放大后的对称对象。
163.步骤s415,将放大后的第一目标对象和放大后的对称对象放置于所述目标容器。
164.该步骤在实现时,可以在目标容器中确定能够放置放大后的第一目标对象和放大后的对称对象的可用空间,并依次放置到各个可用空间,如果存在至少一个不能放置进去的资源对象,则可以将放大比例按照另一权重值进行缩小,再次得到一放大比例,该权重值可以与步骤s413使用的权重值是相同的,也可以是不同的,再次得到的放大比例不小于1。
165.通过上述步骤s411至步骤s415,能够在目标容器中存在第一目标对象的对称对象时,实现对第一目标对象及对称对象的同步放大,从而保证与第一目标对象对称的资源对象能够保持一致性。
166.在一些实施例中,上述步骤s410“基于所述调整后的移动向量、所述目标缩放比例和所述目标旋转角度对所述子资源对象进行移动和放大处理,得到处理后的子资源对象”,可以通过下述的步骤s4101至步骤s4103实现,以下对各个步骤进行说明。
167.步骤s4101,基于所述放大后的第一目标对象的第四中心点和所述调整后的移动向量,确定所述子资源对象的目标位置。
168.这里,可以将第四中心点的第四中心坐标与调整后的移动向量相加,得到子资源对象的目标位置。其中,子资源对象的目标位置是指子资源对象的中心点的目标位置。
169.假设第四中心坐标为(30,40),调整后的移动向量为(0,30),那么子资源对象的中心位置为(30,70)。
170.步骤s4102,将所述子资源对象的第三中心点移动至所述目标位置。
171.步骤s4103,控制所述子资源对象以所述目标位置为旋转中心,旋转所述目标旋转角度,并按照所述目标缩放比例对所述子资源对象进行放大处理,得到处理后的子资源对象。
172.通过上述步骤s4101至步骤s4103,能够将第一目标对象中包含的子资源对象移动至放大后的第一目标对象中,并且能够保证处理后的子资源对象与放大后的第一目标对象的相对位置保持不变。
173.下面,将说明本技术实施例在一个实际的应用场景中的示例性应用。
174.在本技术实施例中,从几何的角度提供一种对象处理方法,用以进行全局装箱优,以满足诸如2uv展开这类可变大小的二维装箱问题的特定需求。本技术实施例提供的对象处理方法分为两个步骤:1)预计算uv岛特征;2)迭代移动uv岛。下面分别进行说明。
175.一、预计算uv岛特征。
176.在本技术实施例中,需要预计算并保存的uv岛(对应其他实施例中的资源对象)特征包含如下两种:1、uv岛的相互包含关系。
177.在针对某些应用的装箱问题中,装箱结果允许一些uv岛处在另外一些uv岛的孔洞中。如图7中的区域701和702所示,较大的区域701显示了包含其它uv岛的大uv岛,较小的区域702则显示了不包含其它uv岛的uv岛。
178.为此,在装箱优化之前,可以预先确定不同uv岛之间的包含关系。确定这类特征的
目的是:当包含其它uv岛的大uv岛需要被更新位置并且扩大时,它所包含的uv岛也可以同步进行位置更新和扩大。这样在完成一次最大空隙计算之后,就可以同时移动多个uv岛,从而提高算法效率。
179.假设有uv岛a和b,计算uv岛a是否被包含在uv岛b之内的方法可以通过以下步骤s601至步骤s603实现:步骤s601,对于uv岛b的每个孔洞h,执行步骤s712;步骤s602,在uv岛a的外边界上随机选取一个点p,利用cgal提供的库函数检查p是否在孔洞h的内部,如果是,则返回是,算法结束;步骤s603,如果点p不在所有孔洞中,则返回否。
180.2、uv岛的横平竖直分类(对应其他实施例中资源对象的姿态信息)。
181.在针对某些应用的装箱问题中,往往需要在位置优化的过程中保持某些uv岛的横平竖直特性。在这种情况下,以横平竖直线段为主的uv岛在位置优化的过程中,只允许旋转90
°
的整数倍。因此需要提前计算uv岛的横平竖直分类,并保存下来供后续算法确定旋转角度。例如在图7所示的区域703中包含的是以横平竖直为主的uv岛(在位置优化的过程中需要保持这种特性),在区域704包含的则是不以横平竖直为主的uv岛(在位置优化的过程中不需要保持这种特性,从而可以旋转任意角度)。
182.计算uv岛的横平竖直分类可以通过下述的步骤s711至步骤s714实现:步骤s711,提取uv岛的外边界和所有孔洞上的线段,记它们的集合为s;步骤s712,初始化横平竖直的边的长度为l1,边的总长度为l;也即将l1和l的长度初始化为0。
183.步骤s713,对于s集合中的每条线段,计算其长度l,并更新l=l+l;如果该线段同时还平行于x轴或者y轴,则更新l1=l1+l;步骤s714,如果l1/l》60%,则认为该uv岛为横平竖直类型的;否则认为是非横平竖直类型。
184.二、迭代移动uv岛。
185.在预先对所有uv岛的特征进行计算并保存结果之后,迭代移动uv岛。其思路是:对于一个给定的装箱结果,迭代执行如下两个步骤:1、计算当前装箱结果中存在的最大空隙;2、寻找可以放置在该空隙的最佳候选uv岛,将其移动到该空隙处并进行适当扩大。
186.图8示出了算法执行的总体流程:在图8左侧图示801中首先计算出当前纹理空间中的最大空隙,如图8左侧图示801中左上角所示的矩形区域8012所示;然后在所有uv岛中,寻找能够放入该空隙的最佳uv岛,如图8左侧图示801中矩形区域8011内所包含的uv岛所示;接着将该uv岛移动到最大空隙处;最后对该uv岛进行适当比例的扩大,如图8右侧图示802中的8021所示,使得它在某个方向上充满该最大空隙。迭代执行上述步骤,直到无法再找到可以容纳已有uv岛的间隙。下面分别对这两个步骤进行说明。
187.1、计算当前装箱结果中存在的最大空隙。
188.计算最大空隙的目的是在装箱结果中寻找uv岛的最佳移动目的地。由于基于多边形的维诺图可以较好地逼近空间位置的走向,所以在本技术实施例中,可以基于多边形维
诺图中的线段来计算最大扩展obb,然后将该最大扩展obb作为最大空隙。在实际实现过程中,可以通过下述步骤s811至步骤s814实现:步骤s811,计算uv岛的外轮廓。
189.如图9中的901所示,由于装箱优化仅仅涉及到uv岛的外轮廓部分,所以首先提取各个uv岛的外轮廓,以便于减少后续计算量。
190.提取uv岛外轮廓在实现时可以是:对于uv岛上的每条边,如果和它相邻的区域均属于uv岛内部,则标记该边为内部边,否则标记为外部边;将所有外部边连接起来,就构成了uv岛的外轮廓。
191.步骤s812,计算外轮廓相对于纹理空间的补集。
192.在实现时,可以采用cgal提供的库函数来计算所有uv岛的外轮廓相对于纹理空间这个总集的补集,如图9中的902所示。
193.步骤s813,计算补集空间的维诺图并得到其中的所有线段:可以采用cgal提供的库函数计算补集空间所对应的维诺图,在图9中的903中仅示出了上半部分的维诺图线段(浅灰色所示)。
194.步骤s814,计算每个线段所对应的最大扩展obb。
195.为了提高效率,在实现时可以采用空间搜索树的方法,计算步骤s813所得到的每个线段所对应的最大扩展obb。图9的904中的矩形区域9041即为图中的水平维诺图线段9032所对应的最大扩展obb。
196.作为示例,确定维诺图线段所对应的最大扩展obb可以通过以下步骤实现:步骤s901,沿着当前线段s的垂直方向,分别朝上和朝下发射射线,然后分别计算朝上和朝下射线的最短交点,并记录它们到s的距离a和b;步骤s902,确定通过s的中点、垂直于s并且朝上和朝下长度分别为a和b的线段t;步骤s903,沿着线段t的垂直方向(即s所在直线的方向),分别朝左和朝右发射射线,然后计算这两条射线的最短交点,并记录它们到t的距离c和d;步骤s904,以s的中点为基准,构造朝上、下、左、右四个方向长度分别为a,b,c,d的矩形,该矩形即为当前线段s所对应的最大扩展obb。
197.2、移动最适当uv岛。
198.当确定出最大空隙之后,往往存在多个uv岛可以被移动到该位置。在确定最适合的uv岛时,需要遵循装箱优化的以下原则:原则1:优先填充大的空隙;原则2:尽量让多个uv岛均匀扩大,避免因少数uv岛大比例扩大而导致大多数uv岛的大小保持不变;原则3:横平竖直为主的uv岛在移动的过程中不破坏其横平竖直的特性。
199.基于上述原则,选择最适当uv岛可以通过图10所示的步骤s1001至步骤s1010实现,以下结合图10对各个步骤进行说明。
200.步骤s1001,判断需要移动的uv岛是否是横平竖直为主的uv岛。
201.在实现时,根据当前最大扩展obb是否横平竖直,来确定需要移动的uv岛是否是横平竖直为主的uv岛。即如果当前最大扩展obb是横平竖直的,那么需要移动的uv岛是横平竖直为主的uv岛,此时进入步骤s1002;否则说明需要移动的uv岛不是横平竖直为主的uv岛,
此时进入步骤s1006。
202.步骤s1002,将横平竖直为主的uv岛确定为候选uv岛。
203.步骤s1003,确定每个候选uv岛的紧致包围盒和扩展比例。
204.在实现时,可以利用cgal提供的库函数计算候选uv岛的紧致包围盒obb,然后确定将候选uv岛移动到当前最大空隙时,该紧致包围盒可以扩展的最大比例,将这个比例确定为该uv岛的扩展比例。
205.步骤s1004,确定是否存在大于扩展阈值的扩展比例。
206.如果存在大于扩展阈值的扩展比例,进入步骤s1005,如果不存在大于扩展阈值的扩展比例,进入步骤s1006。
207.步骤s1005,将大于扩展阈值的扩展比例中的最小者对应的uv岛确定为最适当uv岛。
208.在该步骤中,之所以选择大于扩展阈值的扩展比例中的最小者,主要基于两个原因:1)只移动扩展比例大于扩展阈值的uv岛,是为了防止算法陷入死循环或者运行效率过低。在实践中,可以设定的扩展阈值的默认值为1.2,这可以在效率和效果之间取得较好平衡;2)在所有大于扩展阈值的扩展比例中,之所以选择其中扩展比例最小者,是为了尽量让多个uv岛在位置优化的过程中被均匀扩大,避免少数uv岛大比例扩大而导致大多数uv岛的大小保持不变。
209.步骤s1006,将非横平竖直为主的uv岛确定为候选uv岛,确定每个候选uv岛的紧致包围盒和扩展比例。
210.在本技术实施例中,如果最大空隙对应的当前最大扩展obb是横平竖直的,并且在横平竖直的uv岛中不存在扩展比例大于扩展阈值的uv岛时,可以在所有非横平竖直类型的uv岛中,再次选择最适当的uv岛从而尽可能提高优化效果。但这个过程是单向的:不可以将横平竖直的uv岛放置在非横平竖直的最大扩展obb中,因为这样会破坏原来uv岛的横平竖直特征。
211.步骤s1007,确定是否存在大于扩展阈值的扩展比例。
212.如果存在大于扩展阈值的扩展比例,进入步骤s1008,如果不存在大于扩展阈值的扩展比例,结束流程。
213.步骤s1008,将大于扩展阈值的扩展比例中的最小者对应的uv岛确定为最适当uv岛。
214.步骤s1009,根据选中的uv岛的obb和最大扩展obb来移动当前uv岛。
215.在实现时,首先移动uv岛,使得它的中心点和最大扩展obb的中心点重合,然后旋转该uv岛,使得它的紧致包围盒的长边和最大扩展obb的长边平行。
216.步骤s1010,按照该uv岛对应的扩展比例来扩大该uv岛。
217.另外,在实际2uv展开项目中,往往存在一组或者多组对称uv岛。有时用户希望在装箱的过程中保持这些对称uv岛的大小。此时可以通过以下步骤进行uv岛的移动,从而在保证非对称uv岛得到充分扩大的同时,对称uv岛能够同步扩大或者保持原来的尺寸。
218.步骤s1101,计算当前装箱结果中的所有空隙,以及其中的最大空隙,如果为空,则算法结束。
219.步骤s1102,计算最适合移动的uv岛,记为i,如果没有,则算法结束。
220.步骤s1103,如果i属于非对称uv岛,则按照图10所示的方案将其位置优化到确定出的最大空隙,并转步骤s1101。
221.步骤s1104,如果i属于对称uv岛,提取i所在的对称组中的所有uv岛,然后采用基于nest工具提供的装箱方法将其装箱到确定出的所有空隙中,并转步骤s1101。
222.在步骤s1101至步骤s1104所示的方案中,在确定待移动uv岛之后,首先判断该uv岛是对称uv岛还是非对称uv岛,然后根据判断结果采取不同的位置优化和尺寸扩大策略。由于步骤s1104中对同组所有对称uv岛采取了统一缩放比进行重新装箱,所以可以使得它们在可放置区域内得到最大比例的同步扩展,这也就意味着对称uv岛在保证尺寸统一的前提下,也得到了最大限度的扩展。
223.为了验证本技术实施例提出的对象方法对于2uv展开工具的性能提升,在14个项目的美术资源(a,b,
…
,n)上进行了批量测试,得到了如表1所示的统计结果。
224.表1、本技术实施例提供的对象处理方法有益效果的统计对比在表1中,通过对比无位置优化的装箱工具和有位置优化的装箱工具的平均填充率,发现在加了全局位置优化(也即应用了本技术实施例提供的对象处理方法)之后,装箱工具的填充率可以得到不同程度的提升。平均而言,全局装箱优化方法可以使得填充率提升5%左右,并且使得装箱工具超越人工的占比有大约10%的提升。
225.本技术实施例提供的对象处理方法,可以应用于自动2uv展开工具中,通过采用基于多边形维诺图的全局优化方法,对原始装箱结果中的多个uv岛进行近似均匀的扩大和位置优化。自动2uv展开工具可以对具有烘焙需求的多种游戏场景模型实现2uv展开的自动化,包括角色模型、车辆模型、建筑模型等等。图11展示了本技术实施例提供的对象处理放大的优化效果。其中,图11中的1101、1103和1105为未采用本技术实施例提供的对象处理方法进行优化的装箱结果示意图,图11中的1102、1104和1106为利用本技术实施例提供的对象处理方法进行全局优化后的装箱结果,通过对比可以看出,利用本技术实施例提供的对象处理方法,在不对uv岛进行扭曲变形的情况下,在每一行的对比图中,左侧所示的较大空隙(1101中的矩形框区域11011、1103中的矩形框区域11031、1105中的矩形框区域11051和
11052)在右侧已经被填充了,从而明显提高了装箱填充率。
226.下面继续说明本技术实施例提供的对象处理装置455的实施为软件模块的示例性结构,在一些实施例中,如图3所示,存储在存储器450的对象处理装置455中的软件模块可以包括:对象填充模块4551,用于将待处理的多个资源对象添加到目标容器,得到初始填充结果;第一确定模块4552,用于基于所述初始填充结果确定所述目标容器中的第一目标可用空间,并基于所述第一目标可用空间从所述多个资源对象中确定第一目标对象;第一放大模块4553,用于将所述第一目标对象移动至所述第一目标可用空间,并基于所述第一目标可用空间对所述第一目标对象进行放大处理,得到放大后的第一目标对象;第二确定模块4554,用于确定所述目标容器中的第二目标可用空间和第二目标对象,直至从所述多个资源对象中无法确定出可移动的目标对象。
227.在一些实施例中,该第一确定模块4552,还用于:获取所述多个资源对象的外边界信息,并基于所述初始填充结果确定所述多个资源对象的外边界信息相对于所述目标容器的补集空间;确定所述补集空间的维诺图,并获取所述维诺图中的各个维诺图线段;确定所述各个维诺图线段对应的维诺包围盒;将面积最大的维诺包围盒确定为所述目标容器中的第一目标可用空间。
228.在一些实施例中,该第一确定模块,还用于:确定所述第一目标可用空间对应维诺包围盒的姿态信息;当所述姿态信息表征所述维诺包围盒处于第一姿态时,确定所述多个资源对象中是否存在处于第一姿态的第一候选对象;当确定存在至少一个第一候选对象时,确定各个第一候选对象的第一候选包围盒,并基于所述维诺包围盒确定各个第一候选包围盒对应的第一缩放比例;当存在至少一个大于预设的比例阈值的第一候选缩放比例时,将所述第一候选缩放比例中的最小缩放比例对应的第一候选对象确定为第一目标对象。
229.在一些实施例中,该装置还包括:第二确定模块,用于当所述姿态信息表征所述维诺包围盒处于第二姿态时,或者当不存在第一候选对象时,或者当不存在大于所述比例阈值的候选缩放比例时,从所述多个资源对象中确定处于第二姿态的第二候选对象;第四确定模块,用于确定各个第二候选对象的第二候选包围盒,并基于所述维诺包围盒确定各个第二候选包围盒对应的第二缩放比例;第五确定模块,用于当存在至少一个大于预设的比例阈值的第二候选缩放比例时,将所述第二候选缩放比例中的最小缩放比例对应的第二候选对象确定为第一目标对象。
230.在一些实施例中,该第一确定模块,还用于:获取所述维诺包围盒对应维诺图线段的第一端点的第一坐标信息和第二端点的第二坐标信息;
基于所述第一坐标信息和所述第二坐标信息,确定所述第一端点和所述第二端点在水平方向的第一坐标差值,确定所述第一端点和所述第二端点在竖直方向的第二坐标差值;当所述第一坐标差值小于预设的差值阈值,或者所述第二坐标差值小于所述差值阈值时,确定所述维诺包围盒的姿态信息为处于第一姿态;当所述第一坐标差值不小于所述差值阈值,并且所述第二坐标差值不小于所述差值阈值时,确定所述维诺包围盒的姿态信息为处于第二姿态。
231.在一些实施例中,该第一确定模块,还用于:获取各个资源对象的姿态信息和包含关系信息;基于所述各个资源对象的姿态信息和包含信息,确定所述多个资源对象中是否存在处于第一姿态且不被其他资源对象包含的第一候选对象。
232.在一些实施例中,该第一确定模块,还用于:获取所述维诺包围盒的第一长度和第一宽度,获取所述第一候选包围盒的第二长度和第二宽度;将所述第一长度和所述第二长度的商确定为长度缩放比例;将所述第一宽度和所述第二宽度的上确定为宽度缩放比例;将所述长度缩放比例和所述宽度缩放比例中的较小值确定为所述第一候选包围盒对应的第一缩放比例。
233.在一些实施例中,该第一放大模块,还用于:确定所述目标容器中不存在所述第一目标对象的对称对象时,获取所述第一目标对象的包含关系信息;当所述包含关系信息表征所述第一目标对象中未包含子资源对象时,将所述第一目标对象的第一中心点移动至所述第一目标可用空间的第二中心点;以所述第一中心点为旋转中心,旋转所述第一目标对象,直至所述第一目标对象的包围盒的长边和所述第一目标可用空间对应的维诺包围盒的长边平行。
234.在一些实施例中,该装置还包括:第六确定模块,用于当所述包含关系信息表征所述第一目标对象中包含子资源对象时,确定所述第一中心点和所述子资源对象的第三中心点之间的移动向量;第二放大模块,用于将所述第一目标对象移动至所述第一目标可用空间,并对所述第一目标对象进行放大处理,得到放大后的第一目标对象;第一获取模块,用于获取所述放大后的第一目标对象相对于所述第一目标对象的目标缩放比例和目标旋转角度;第一调整模块,用于利用所述目标缩放比例和所述目标旋转角度,对所述移动向量进行调整,得到调整后的移动向量;第三放大模块,用于基于所述调整后的移动向量、所述目标缩放比例和所述目标旋转角度对所述子资源对象进行移动和放大处理,得到处理后的子资源对象。
235.在一些实施例中,该第三放大模块,还用于:基于所述放大后的第一目标对象的第四中心点和所述调整后的移动向量,确定所述子资源对象的目标位置;
将所述子资源对象的第三中心点移动至所述目标位置;控制所述子资源对象以所述目标位置为旋转中心,旋转所述目标旋转角度,并按照所述目标缩放比例对所述子资源对象进行放大处理,得到处理后的子资源对象。
236.在一些实施例,该装置还包括:对象移出模块,用于确定所述目标容器中存在所述第一目标对象的对称对象时,将所述第一目标对象和所述对称对象从所述目标容器中移出;第六确定模块,用于确定所述目标容器的当前可用面积,并确定所述第一目标对象和所述对称对象的占用面积;第七确定模块,用于基于所述当前可用面积和所述占用面积,确定所述第一目标对象和所述对称对象的放大比例;第四放大模块,用于基于所述放大比例对所述第一目标对象和所述对称对象进行放大处理,得到放大后的第一目标对象和放大后的对称对象;对象放置模块,用于将所述放大后的第一目标对象和所述放大后的对称对象放置于所述目标容器。
237.在一些实施例,该装置还包括:第二获取模块,用于获取第i个资源对象的各个孔洞信息,i=1,2,
…
,n,n为资源对象总数;第八确定模块,用于从第j个资源对象的外边界上随机确定一个参考点,确定所述参考点是否位于第i个资源对象中的孔洞内部,j=1,2,
…
,n,且i不等于j;信息更新模块,用于如果所述参考点位于所述第i个资源对象中的孔洞内部,确定所述第i个资源对象包含所述第j个资源对象,更新第i个资源对象和第j个资源对象的包含关系信息;第九确定模块,用于如果所述参考点不位于所述第i个资源对象中的孔洞内部,确定所述第i个资源对象不包含所述第j个资源对象。
238.在一些实施例,该装置还包括:第三获取模块,用于获取第i个资源对象包含的各个线段和所述各个线段的长度;第十确定模块,用于基于所述各个线段的端点信息确定目标线段,所述目标线段的两个端点在水平方向的第一坐标差值小于预设的差值阈值,或者所述目标线段的两个端点在竖直方向的第二坐标差值小于所述差值阈值;第十一确定模块,用于基于所述各个线段的长度确定所述第i个资源对象的第一总长度;第十二确定模块,用于基于目标线段的长度确定所述第i个资源对象的第二总长度;第十三确定模块,用于如果所述第二总长度与所述第一总长度的比值大于预设的比值阈值,确定所述第i个资源对象的姿态信息为第一姿态。
239.需要说明的是,本技术实施例针对对象处理装置的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本装置实施例中未披露的技术细节,请参照本技术方法实施例的描述而理解。
240.本技术实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计
算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本技术实施例上述的对象处理方法。
241.本技术实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本技术实施例提供的对象处理方法,例如,如图4、图5和图6示出的对象处理方法。
242.在一些实施例中,计算机可读存储介质可以是fram、rom、prom、eprom、eeprom、闪存、磁表面存储器、光盘、或cd-rom等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
243.在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
244.作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(html,hyper text markup language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
245.作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
246.以上所述,仅为本技术的实施例而已,并非用于限定本技术的保护范围。凡在本技术的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本技术的保护范围之内。