CN115964025A - 一种在unity程序制作中输出模型数据的方法 - Google Patents
一种在unity程序制作中输出模型数据的方法 Download PDFInfo
- Publication number
- CN115964025A CN115964025A CN202211721891.0A CN202211721891A CN115964025A CN 115964025 A CN115964025 A CN 115964025A CN 202211721891 A CN202211721891 A CN 202211721891A CN 115964025 A CN115964025 A CN 115964025A
- Authority
- CN
- China
- Prior art keywords
- data
- output
- value
- file
- vertex
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 195
- 230000008569 process Effects 0.000 claims abstract description 46
- 238000012545 processing Methods 0.000 claims abstract description 24
- 238000011161 development Methods 0.000 claims abstract description 5
- 239000000463 material Substances 0.000 claims description 53
- 238000004364 calculation method Methods 0.000 claims description 15
- 239000013598 vector Substances 0.000 claims description 13
- 238000002360 preparation method Methods 0.000 claims description 8
- 238000013461 design Methods 0.000 description 12
- 238000010276 construction Methods 0.000 description 9
- 230000000694 effects Effects 0.000 description 9
- 230000008901 benefit Effects 0.000 description 6
- 238000010586 diagram Methods 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 6
- 238000007726 management method Methods 0.000 description 6
- 238000004519 manufacturing process Methods 0.000 description 5
- 238000003860 storage Methods 0.000 description 5
- 238000003491 array Methods 0.000 description 4
- 238000006243 chemical reaction Methods 0.000 description 4
- 230000006870 function Effects 0.000 description 4
- 230000009467 reduction Effects 0.000 description 4
- 241001669679 Eleotris Species 0.000 description 3
- 230000009471 action Effects 0.000 description 3
- 230000018109 developmental process Effects 0.000 description 3
- 239000000203 mixture Substances 0.000 description 3
- 238000009877 rendering Methods 0.000 description 3
- 238000012800 visualization Methods 0.000 description 3
- 238000003466 welding Methods 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 238000013523 data management Methods 0.000 description 2
- 230000033001 locomotion Effects 0.000 description 2
- 238000012552 review Methods 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 239000013585 weight reducing agent Substances 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 239000003245 coal Substances 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 239000006185 dispersion Substances 0.000 description 1
- 230000008030 elimination Effects 0.000 description 1
- 238000003379 elimination reaction Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000005286 illumination Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 239000002184 metal Substances 0.000 description 1
- 238000002620 method output Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 230000008092 positive effect Effects 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
- 230000011218 segmentation Effects 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
- 230000007480 spreading Effects 0.000 description 1
- 238000003892 spreading Methods 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02P—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN THE PRODUCTION OR PROCESSING OF GOODS
- Y02P90/00—Enabling technologies with a potential contribution to greenhouse gas [GHG] emissions mitigation
- Y02P90/30—Computing systems specially adapted for manufacturing
Landscapes
- Processing Or Creating Images (AREA)
Abstract
本发明涉及一种在unity程序制作中输出模型数据的方法,使用Autodesk提供的revit二次开发接口‑IExportContext,通过编写上下文的参数和在上下文的过程中加入对数据的提取和处理等方法,进行全部目标数据的输出,包括:Start()、OnViewBegin()、OnElementBegin()、OnMaterial()、OnFaceBegin()、OnPolymesh()、OnElementEnd()、OnViewEnd()、Finish()等联系上下文的9个过程方法;本发明的方法拓展了revit数据的数据媒质、增加了建筑信息的可用程度。
Description
技术领域
本发明涉及一种在unity程序制作中输出模型数据的方法,可应用于市政基础设施设计、BIM(Building Information Modeling)技术、三维可视化、工程管理等领域,涵盖电子计算机、土木、建筑学等专业学科。
背景技术
从目前已公开的多项技术进行分析,均使用了revit模型输出成json文件,json文件将revit中建立的模型通过序列化的对象或数组进行描述,描述模型的几何信息、建筑相关的非几何信息及附着的自定义信息,再通过三维图形引擎的程序或脚本读入JSON数据,在图形引擎中对其进行展示和管理,实现其功能。
但从目前已公开的技术中,均不包含具体的操作方法,只是对上述的流程做简要的描述,在遇到一些实际问题时,从已公开的技术方案中无法获得较为全面的解决内容,这些具体的问题不仅有碍于revit的数据输出,并且也会影响后续的展示和管理。而上述问题在本发明的实施方案中得以妥善解决。
发明内容
本发明提出基础几何单元的概念,在数据上是以图元ID+材质ID作为基础几何单元的ID,从而避免了单一图元中包含多种材质,致使输出的基础几何ID区分不出不同材质的几何位置的致命问题。
在此基础上,本发明提供一种在unity程序制作中输出模型数据的方法,使用Autodesk提供的revit二次开发接口-IExportContext,通过编写上下文的参数和在上下文的过程中加入对数据的提取和处理等方法,进行全部目标数据的输出,包括以下步骤:
步骤Start(),需要初始化数据字典、上下文实例,并存储项目信息、项目所有标高信息集合、项目基点信息等;
步骤OnViewBegin(),用来设置和存储LOD(模型精细度)信息;
步骤OnElementBegin(),获得输出几何单元(构件Element)的ID值,即ElementId,该值用以获得模型中构件的ID值;
步骤OnMaterial(),根据当前ElementId所对应的模型构件获取这个构件中的所有MaterialNode,再根据每个node节点得到对应的Material材质的UniqueId和针对材质的一系列信息;
步骤OnFaceBegin(),以facenode对象作为参数,获得face节点;
步骤OnPolymesh(),以PolymeshTopology为对象参数,获得最小物体单元的所有顶点数据、面数据、法线数据和UV数据;
步骤OnElementEnd(),以ElementId为参数,将完成所有输出数据的准备工作,其中包括顶点和顶点序列的数据处理、顶点法线和法线序列的数据处理、顶点UV的计算处理、自定义数据的获取;
步骤OnViewEnd(),结束对View对象的调用;
步骤Finish(),将所有已经准备好的数据进行JSON文件的输出。
其中,在步骤OnViewBegin()中,用户在启动输出程序的界面上设置从0-15级的某一个级别的LOD进行这个精细度下输出。
其中,在步骤OnElementBegin()中,通过该值进行模型的检索和调用,并获取构件的UniqueId,以防止ElementId重名。
其中,在步骤OnMaterial()中,一系列信息包括:漫反射颜色ambient(即为该材质的代表颜色)、透明度、纹理坐标、纹理文件和纹理文件的路径等。
其中,在步骤OnPolymesh()中,最小物体单元为Element UniqueId+“_”+MaterialUniqueId物体。
其中,在步骤OnPolymesh()中,建立几何输出数据的方式为:首先将顶点集合进行去重操作,得到去重后的pts顶点集合和相应的字典;调用PolymeshTopology.GetFacets(),遍历所有得到的Facet(基础几何单元中的面片),将Facet的顶点与pts顶点字典建立查询关系,将查询到的字典位置数按遍历facet的顺序和facet自身排列的顶点顺序进行排列和存储,从而得到mesh所有点对应facet面的顶点序列;在遍历所有facet时,根据DistributionOfNormals参数的值判断facet记录法线向量的方法,当取值为OnePerFace或OnEachFacet时,将三个顶点的法线向量值取为物体或当前面的第一个顶点的取值,当取值为AtEachPoint时,则按facet的顶点顺序获得顶点法线向量的值,根据不同方式的顶点法线取值获得一个顶点法线向量的集合和字典;在遍历所有facet时,通过PolymeshTopology.GetUVs()获取每个顶点对应的UV值,该值的物理意义是对应这个facet面使用的纹理文件的纹理坐标值,并非传统意义上是uvw坐标系统的相对坐标值,将此值的集合建立uv集合和字典。
其中,在步骤OnElementEnd()中,在生成mesh对应的完整的uv集合前,将OnPolymesh()过程方法中得到的每个对应基础几何单元的uv集合中的uv坐标值与这个基础几何单元该facet面对应的纹理文件总像素坐标值进行同一坐标轴的相除求余计算,并替换原有的uv集合,再去重并计算序列数据,最终得到UV数组和UV序列数组,以此完成所有几何信息的准备工作;
其中,在步骤OnElementEnd()中,每个基础几何单元的自定义数据都是相同的,都对应的是ElementId,同一个ElementId下的所有基础几何单元的材质信息和几何信息都不一定相同。
其中,在步骤Finish()中,使用Newtonsoft.Json库文件进行JSON数据的输出。
本发明方法在数据输出时是根据IExportContext接口的输出流程进行分步骤输出,由于流程中对对象的调用,产生了用物体的guid+材质的guid作为最小物体单元的id名称的方法进行物体区分(存储入表)的,并且在存储入表的时候,为了在输出时尽可能多的输出数据,采用了单一物体对象数据单独存储的方法,确保了在一定lod设置下全部输出数据的可能性。
将数据进行全部存储,物体的guid和材质id进行组合实现最小单元物体的id名称,这种方法的优势在于更加全面和准确的保存了物体的所有特征,这种方法的技术优势还在于,在执行过程中,由于IExportContext是先调用物体的GUID进行遍历,在物体guid调用的同时在执行该物体上所有材质id的遍历调用,这就会出现一个物体多种材质的情况出现,从物理世界的反应看,也会出现上述情况,比如一些被焊接在一起的不同材质的金属物体,焊接接口两边分属不同材质,但物体却采用了一个物体ID,如果采用物体的GUID,这就是一个物体,但其实是两种焊接材质,需要分别保存,这也是revit的物体表达方式和IExportContext的数据输出流程造成的特有现象,本方法是专门研究了这些特点,按技术特点和物理规律使用了本发明方法。另外,前面提及的存储也是本发明方法的特点,IExportContext在调用时,由于visual studio(简称VS)在调用JSON输出接口时输出的数据量受VS、接口、系统本身的限制,因此在输出数量非常大的情况下会造成溢出现象,这是系统特性造成的,也可以看成是系统误差,
本发明方法是通过在文件夹和文件保存上进行规范化来规避单一物体数据量超大造成溢出的现象,换言之就是一个物体存成一个文件,把文件放在规则的文件夹里。
本发明具有以下积极有益效果:
第一,拓展了revit数据的数据媒质。revit模型在revit内部进行展示和管理是极为方便的,但是revit仅为本机程序,无法实现网络设计成果的共享,在BIM设计逐渐替代传统设计的年代,本机操作的局限性显而易见。如果将revit模型通过输出的方法,获得封装和展示,既解决了信息传递的问题(封装文件有利于信息的流转),也解决了网络环境读取信息的问题,增加了传播煤质和管理的方法。
第二,增加了建筑信息的可用程度。从建设的全生命周期管理到数字孪生,从VR、AR、MR到元宇宙,建筑信息被利用的关键在于数据是什么,怎么存储,如何调用,本技术方案包含了一整套建筑信息的输出、存储、调用的方法。从revit到json,再到unity的图形,完美诠释了建筑信息被利用的方法。
附图说明
结合附图,并通过参考下面的详细描述,将会更容易地对本发明有更完整的理解并且更容易地理解其伴随的优点和特征,其中:
图1是本发明的Revit输出json文件并在unity3d等三维引擎中展示和管理的方法的流程图。
图2是本发明方法中revit通过IExportContext输出数据的整体流程。
图3是本发明方法中reivt输出过程中各个流程所输出的内容。
图4是本发明的全局数据框架内容构成图。
图5是本发明方法中几何数据集内容构成图。
图6是本发明方法中输出文件夹的结构图。
图7是利用本发明方法在通州副中心枢纽站施工模型输出展示成果图。
图8是利用本发明方法在某车站轨枕系统模型输出展示效果图。
图9是利用本发明方法在新航城输出展示成果截图。
具体实施方式
下面将结合本发明实施例中的附图对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例;基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
发明的技术方案包括四个部分,参见图1:
(1)Revit数据输出
首先,revit数据的输出包含了几何信息、模型建立过程中的设计信息和模型作为信息传递的承载工具所承载的自定义信息。几何信息包含描述revit几何的顶点数据空间位置数据、顶点索引数据、法线向量数据、法线向量索引数据、UV数据、纹理数据、贴图数据等;模型的设计数据主要有:模型的种类信息、族库信息、标高数据、针对设计原理产生的数据等;自定义数据可以包含在模型全生命周期所需要附着的信息,比如模型的施工单位、模型对应真实实体的管理单位等,这些信息都是通过附着的方式在模型建立后被存储并和模型的检索ID形成关联的信息。
将上述三大类信息进行分别输出,在revit中需要进行组合的api调用,根据Autodesk(revit的生产供应商)公司提供的revit的SDK中,可以将revit生成的模型进行几何数据输出的方法大致有两个:IExportContext和IExportElement。IExportContext是通过编辑Context上下文的参数,从而可以调用revit文件的整个view对象,在view的生成过程中获得数据,而IExportElement是对revit数据库中的物体的纯几何输出,使用边面法(brep),可以获得物体从解析到离散的计算数据。综上,IExportContext在输出时调用了revit图形引擎已经绘制后的数据信息,因此在可视化方面有一定的保证;而IExportElement则是使用brep法进行解析几何向离散几何数据的转变,因此并不是图形引擎绘制的成果数据,因此在一些可视化上并不详实充分,例如uv数据输出时,并不与其相同过程的顶点对应,这种uv数据无法在图形引擎中得以使用。所以大多公开的技术流程均采用了IExportContext过程方法进行输出,本发明也应用这个方法;如果使用IExportElement,天然无法得到可以获得使用的uv数据。
在已有使用IExportContext的过程方法进行输出的技术方案中,对记录物体(构件,revit对象为Element)的ID均未提出具体方案或直接使用了revit的ElementId或构件名称进行记录;在这个基础上,也未曾提及材质(Material)的存储记录的方法。这些技术方法显然忽略了在一个构件中使用不同材质的情况,在revit输出的过程中这部分内容是被遗漏的,本发明中通过更新方法,将遗漏的构件进行了有效的补充。
本技术方案与已公开的技术方案的最大差异为:提出基础几何单元的概念,在数据上是以图元ID+材质ID作为基础几何单元的ID,从而避免了单一图元中包含多种材质,致使输出的基础几何ID区分不出不同材质的几何位置的致命问题。
技术方案:
本方案使用Autodesk提供的revit二次开发接口-IExportContext,通过编写上下文的参数和在上下文的过程中加入对数据的提取和处理等方法,进行全部目标数据的输出。
IExportContext包括:Start()、OnViewBegin()、OnElementBegin()、OnMaterial()、OnFaceBegin()、OnPolymesh()、OnElementEnd()、OnViewEnd()、Finish()等联系上下文的9个过程方法,这9个方法是按上下文联系形成的完整流程,参见图2,是Autodesk提出的二次开发接口的必要方法,每个过程方法中如何编辑上下文程序从而实现自有功能,是每个技术方案的创新点,IExportContext是这些创新点的载体。各部分的主要输出内容见图3。每部分输出的内容又跟整体技术方案第二部分的JSON数据的设计相关。
Start()方法中需要初始化数据字典、上下文实例,并存储项目信息、项目所有标高信息集合、项目基点信息等。该过程方法是初始化过程,获取的信息均为项目的全局信息,项目范围为revit文件的内容范围。
OnViewBegin()用来设置和存储LOD(模型精细度)信息,用户在启动输出程序的界面上设置从0-15级的某一个级别的LOD进行这个精细度下输出,OnViewBegin()启动后将上述过程的窗体变量中的LOD值取出后设置在本过程方法中的变量中,并采用该值作为精细度设置进行模型数据输出,输出后并将该值在JSON文件中保存,从而实现了使用者自定义输出的模型精细度,如果不自定义,该方法默认将其值设置为7,经过测试,7级虽然为适中的精细度,但表达模型已经相当精细,本发明方法中在不做出选择时,默认采用4级进行输出,精细程度尚可。
OnElementBegin()方法中获得输出几何单元(构件Element)的ID值,即ElementId,该值用以获得模型中构件的ID值,并通过该值进行模型的检索和调用,并获取构件的UniqueId,以防止ElementId重名。从本过程开始,即在View对象中循环调用所有revit的Element。在已公开的技术中,均以该值作为几何输出单元的ID值,或者采用了一种未公开的技术细节用以存储或调用几何构件。
从IExportContext执行的总体固定流程看,OnElementBegin过程方法在OnMaterial过程之前,因此一个特定ElementId的模型构件中可以包含多个OnMaterial方法中的MaterialNode材质节点,每个节点都会用单一特定的MaterialID进行检索,这就造成使用ElementId无法检索和获取到MaterialNode的物体,而只能获得ElementId上的物体,进而无法区分物体上不同材质的几何部分,针对不同材质的数据管理也无法实现;其次,ElementId是revit检索rvt文件的元素ID,但不同rvt文件该值可能会重复,因此本方法中通过OnElementBegin()过程方法获得ElementId后,再通过ElementId获得当前构件的UniqueId,作为输出该构件ID的一部分,这样做可避免在多个revit数据文件(rvt文件)进行输出时可能造成的ElementId重名的情况。
OnMaterial()过程方法中可根据当前ElementId所对应的模型构件获取这个构件中的所有MaterialNode,再根据每个node节点得到对应的Material材质的UniqueId和针对材质的一系列信息,如漫反射颜色ambient(即为该材质的代表颜色)、透明度、纹理坐标、纹理文件和纹理文件的路径等。注意这里提及的纹理坐标值为纹理文件的像素坐标。
材质UniqueId和当前的Element的UniqueId进行连接组合,即为当前物体(当前模型构件下的不同材质的子构件)的名称和检索ID,这就是本发明方法与其他技术方法的区别。综上,获取Element UniqueId以替代ElementID为其一区别;用Element UniqueId+“_”+Material UniqueId,两个UniqueId中间用英文字符的下划线(_)连接,作为基础几何单元的ID,并以基础几何单元进行输出,是其二区别。
另外,本方法中包含了一项对纹理坐标进行的特殊处理方法,是已公开的技术方案所未涉及的。根据revit的SDK所有提供针对纹理贴图的坐标方法,都不是图形学规定的UV相对坐标,而是根据纹理文件大小计算的像素坐标,本发明方法包含将像素坐标值转换成uvw坐标系的相对坐标值的方法,在后续过程方法中会解释。
OnFaceBegin()过程方法是IExportContext的第五步,该步的参数为facenode对象,即OnFaceBegin(FaceNode node),获得face节点,从而取得face,face未在本发明方法中提供信息。
OnPolymesh()过程方法是IExportContext的第六步,该步的参数为PolymeshTopology对象,通过PolymeshTopology对象的属性和方法,可以获得ElementUniqueId+“_”+Material UniqueId物体(以下称之为最小物体单元)的所有顶点数据、面数据、法线数据和UV数据。下面为具体建立几何输出数据的方法:
PolymeshTopology.GetPoints()方法提供了顶点集合,该顶点数据为基础几何单元的全部顶点,由于物体表面的mesh面可能会共用顶点,因此首先将顶点集合进行去重操作,得到去重后的pts顶点集合和相应的字典;调用PolymeshTopology.GetFacets(),遍历所有得到的Facet(基础几何单元中的面片),将Facet的顶点与pts顶点字典建立查询关系,将查询到的字典位置数按遍历facet的顺序和facet自身排列的顶点顺序进行排列和存储,从而得到mesh所有点对应facet面的顶点序列;在遍历所有facet时,根据DistributionOfNormals参数的值判断facet记录法线向量的方法,当取值为OnePerFace或OnEachFacet时,将三个顶点的法线向量值取为物体或当前面的第一个顶点的取值,当取值为AtEachPoint时,则按facet的顶点顺序获得顶点法线向量的值,根据不同方式的顶点法线取值获得一个顶点法线向量的集合和字典;在遍历所有facet时,通过PolymeshTopology.GetUVs()获取每个顶点对应的UV值,该值的物理意义是对应这个facet面使用的纹理文件的纹理坐标值,并非传统意义上是uvw坐标系统的相对坐标值,将此值的集合建立uv集合和字典。以上是初步获得几何数据的方法描述。由于遍历facet时采用的是最小物体单元的几何范围,因此存储时所有的集合和对应的字典均按ElementUniqueId+“_”+Material UniqueId的名称进行存储和检索,这就确保了所有不同材质的几何形体的全量输出,这就是本发明的最大优势。
OnElementEnd()是IExportContext的第七步,该步骤的参数为ElementId,本步将完成所有输出数据的准备工作,其中包括顶点和顶点序列的数据处理、顶点法线和法线序列的数据处理、顶点UV的计算处理、自定义数据的获取。将OnPolymesh()中生成的pts集合和按facet进行序列化的序列数据,可以表述空间几何体的每个三角面片都是如何排列的,即pts数组和pts对应的序列数组,即为顶点数据的结果,本过程方法遍历每个ElementId,即可以遍历每个基础几何单元,按照基础几何单元的方法存储pts和pts对应的序列数组,形成所有mesh的顶点数据集合;将OnPolymesh()生成的顶点法线数值集合进行去重,获得一个顶点法线数值和字典,再用顶点法线非去重的数组的每个顶点数值与去重后的顶点法线字典进行查询,获得在字典中的排序位置,得到序列集合,再在遍历的基础几何单元中形成所有mesh的去重顶点法线数组和序列数组;uv值的计算包含自有算法,在OnMaterial()过程方法中已经获得了每个facet面对应的纹理坐标值,该值是在这个facet面上使用的纹理文件的总像素坐标值,而OnPolymesh()过程方法中得到的UV坐标值是针对这个facet面上对应的纹理文件的像素坐标,为得到传统意义上uvw坐标系统的坐标值,本发明方法在生成mesh对应的完整的uv集合前,将OnPolymesh()过程方法中得到的每个对应基础几何单元的uv集合中的uv坐标值与这个基础几何单元该facet面对应的纹理文件总像素坐标值进行同一坐标轴的相除求余计算,并替换原有的uv集合,再去重并计算序列数据,最终得到UV数组和UV序列数组,以此完成所有几何信息的准备工作;遍历ElementId时,通过调用GetOrderedParameters()方法,遍历获得当前Element的所有自定义数据的属性名称和属性值,分别保存,并按照基础几何单元的ID保存到每个对应的基础几何单元的数组和字典中。
特别解释:每个基础几何单元的自定义数据都是相同的,因为他们对应的是ElementId,同一个ElementId下的所有基础几何单元的材质信息和几何信息都不一定相同,这体现本发明方法中最为重要的技术点的优势,将更小的区别体现在数据中。另外在处理UV数据时,本发明方法并没有直接使用OnPolymesh()过程方法中PolymeshTopology.GetUVs()得到的UV像素坐标,而是通过得到像素坐标对应的像素文件的总像素坐标值,进行相除求余的方式,获得相对的uv坐标,这就对应了很多图形引擎的物理意义。需要说明一点,在计算机图形学中,uv坐标并不是针对facet面的,而是针对整个mesh几何体的,即mesh对应的是一个完整的纹理文件,但revit在显示过程中并没有遵循这个图形学的常识,而是将mesh中的每个facet面对应一个纹理文件,每个纹理文件在这个facet面上的uv坐标都是基于该facet面的。本发明方法是基于revit图形引擎计算得到的结果进行数据提取的,所以无法改变这个先天不足,不过本方法的更新在revit改变了以mesh对应单一纹理文件后,依然适用。
OnViewEnd()是IExportContext上下文流程中的第八个过程方法,此方法结束了View对象的调用,本发明方法并没有在这个过程方法中进行上下文的程序编写。
Finish()是整个IExportContext最后一个过程方法,在该过程内,要将所有已经准备好的数据进行JSON文件的输出,本发明方法使用较为普遍的Newtonsoft.Json库文件进行JSON数据的输出。
至此完成了第一部分,即revit输出模型数据的全部内容介绍。
(2)JSON的使用设计
从revit的IExportContext的api接口中编写上下文,完成接口调用后,即获得了revit的几何数据,前文已经提到数据不仅包含几何数据,还包含设计信息数据和自定义信息数据,这三种数据如何进行存储,是该领域技术方案的又一个难点。
从目前大多数已公开的技术方案可以得知,在调用IExportContext进行上下文编辑时,同时调用了JSON文件的.net支持库,支持库的种类有很多,但几乎都是进行单一JSON文件的输出,将几何(几何中也有多个数据类别)、非几何(设计信息)、自定义通过单一JSON文件的不同对象不同数组进行封装保存。最初使用的就是这种方法进行存储,但在实际的输出过程中发现有些模型的单一构件和整体输出数据量极大,如果单数据段(单个对象或数组的实例)总字节超过300M字节,总体数据量超过1G字节,JSON的支持库就无法提供输出,因此在实际输出的过程中,需要对输出数据段的方法做一些优化处理,以便将所有数据进行有效输出,而这些方法在目前已公开的技术中均未曾提及。
如何在JSON文件中包含需要输出序列化对象和数组,也是需要进行设计的,该方法不仅影响输出的效果,也影响到数据在三维图形引擎中展示和管理的效果。
JSON文件作为数据输出的载体,在本发明方法中有两点技术的使用是专门匹配本发明方法的。
首先JSON文件存储的路径设计,其次是每个JSON文件中的数据对象和数组的设计方法。
在revit输出模型数据时,已经公开的技术均未对如何进行json文件的存储有较为详尽的描述,在设计输出程序之初,在Finish()过程方法中将revit数据文件即rvt文件作为一个对应的JSON文件进行几何、设计信息和自定义数据的集中输出,但经过多个项目的测试发现,由于revit构件被离散几何的顶点、法线、uv表达后,数据量激增,通常一个几十M字节的rvt文件会形成高达上G字节的几何数据量,这种情况出现在rvt以族库的例子引用族文件时,且族文件的mesh几何量极大时,即每个几何体的mesh面都很多,而且被引用了很多次,就造成所有mesh的几何数据量极大。在输出过程中就会出现卡死、崩溃的情况。
为了解决上述问题,本发明方法改变了输出策略,将几何、非几何数据分开保存,几何数据按照每个mesh(对应一个基础几何单元)分别保存,所有的JSON文件通过自身文件名和JSON中的数据对象的逻辑性进行对应检索,这就解决了单一JSON文件数据量较大,无法输出的问题。
在每个几何、非几何文件中,又分别规定了输出的内容,这些输出的内容可以按照物理意义在数据引擎中进行调用和管理。
设计的JSON文件分为两类,第一类为全局数据文件,文件中的内容参见全局数据框架列表和图4(全局数据框架内容构成图);另一类为几何数据集,内容参见几何数据集列表和图5(几何数据集内容构成图)。上述两类的数据列类表如下:
上述两种数据列表遵循C#语言中的数据类的声明环节,在实际使用过程中只需将汉字部分替换成符合c#语言规定的变量名称即可。
输出时包含三部分内容:
a.几何数据:文件单独输出,包含几何数据集class中的子类数据,文件名称使用物体属性class中“几何ID-材质ID”(这里用的是连接符,与输出程序中的下划线不一样),该文件输出前先建立一个与revit文件名相同的文件夹,所有上述几何数据文件均存储与该文件夹中;
b.全局数据:该文件对应revit文件名,一个revit文件对应属于该revit文件的全局数据,输出时与revit文件同存储于一个文件夹。感觉全局数据框架的class进行输出。
c.纹理文件:纹理文件本身不属于JSON,作为项目输出的一部分,为保证在三维数据引擎中正确引用纹理文件,先在与revit文件相同文件夹中建立一个名为“texture”的文件夹,按全局JSON数据中材质集中的纹理路径提取纹理文件存储与于texture文件夹里。
至此通过对JSON文件和文件夹的使用,并对整个输出数据进行设计后完成了数据的输出和保存。多个revit文件项目输出的文件夹结构图见图6.
(3)几何数据轻量化
在已有的技术方案中,分两类方式进行数据的处理:第一类是拆分mesh;第二类是在mesh中进行几何形态的处理。第一类是数据存储方面的,不涉及形变;第二类是mesh面片在空间上的关系,通过减面的方法获得数据量的减少。本发明采用第二类技术,不涉及减面的具体方法,只是在减面的过程中实施分类,已获得较为妥帖的模型数据。
通过对输出数据进行展示发现,一些数据的几何文件极其冗赘庞大,指示一些三维图形引擎无法读入和正常显示,所以本发明方法考虑到这个情况,对输出的数据进行了轻量化的方法,该方法借助商业商业软件PiXYZ-Studio进行轻量化。
由于本发明方法中已经在JSON文件中将几何和非几何信息分离保存,本方法只需将模型的几何数据导入进PiXYZ-Studio中,然后采用Python脚本逐一对几何数据进行轻量化处理。
按单一mesh的顶点数分为三段分别采用不同方法进行处理:
A.顶点数大于65536
图形引擎为了适应硬件的能力,将单一mesh的顶点数按65536即2^16进行划分,高级的硬件支持大于65536的顶点显示,低级的硬件对大于65536的显示力不从心,因此图形引擎也在这个数值上做了限制,为了保证在更多的图形引擎和硬件上的兼容性,本发明方法将顶点数大于65536的mesh几何数据轻量化至65536个顶点之内,因此使用Python脚本调用algo.decimateTarget(mesh,["triangleCount",a],b1,b2,b3,b4,b5,C1,C2),其中a是目标三角面片数,b1、b2、b3、b4、b5是权重参数,选默认值,c1、c2也纹理系数,选默认,mesh则为导入的几何mesh对象。因本方法的目标指是三角面片,但本发明方法中的目标值是顶点数,因此采用试算的方法,每次试算在上一次试算的基础上a值递减500,只到顶点数小于65536停止试算。
B.顶点数介于5000-65536之间的
该段采用梯度计算的方法,将5000对应数值1,65536对应数值X(X介于0.5-1之间选取),根据数据轻量化的结果自行选取,按mesh的顶点数计算从5000-65536的梯度值,调用algo.decimateTarget(mesh,
["ratio",ratioV],b1,b2,b3,b4,b5,C1,C2),ratioV即为梯度值。
C.顶点数小于5000
该范围内不做处理。
分段计算既保证了大体量数据的轻量化,且将其轻量化至可以显示的程度,又保证了小体量数据的完整性。与市面上较为流行的拆分mesh面的方式不同,本发明方法保留了一个mesh是一个几何构件的基础条件,如果进行mesh面的拆分,对于后期的数据管理并不友好;但这样做的显示效果可能不如拆分mesh的方法好。
Python程序脚本在处理完几何数据后,会在原几何数据文件下增加一个名为“轻量化”的文件夹,并将轻量化处理后的几何数据按第三部分JSON的几何数据文件格式进行输出,文件名与原文件名一致。
(4)Unity的展示方法
在已公开的方法中有很多unity3d读取JSON文件的方法,也有使用webGL方法来进行模型绘制和管理的方法。但通常都是将数据作为asset进行读入后,使用unity3d的打包工具进行展示和管理的,这种方法通常是调用上文提及的.net的JSON支持库,在unity3d的程序中将JSON文件的几何信息读入unity中后形成asset中的mesh对象进行保存,然后在读取纹理数据,创建材质球保存到asset中,再将mesh上附着材质球上的材质数据,形成材质和纹理,在输出unity程序时,将材质数据和几何数据进行打包,在unity程序运行是由unity程序将这些打包好的asset数据读入进程序内部就进行展示。
这种方法是典型的unity程序制作的方法,但这个方法无法实现通用性,本发明针对这个问题,提出了一个全新的技术方案,极大提升了现有技术的通用性。
本发明方法涉及的unity展示方法是基于本发明方法提出的输出文件的一个创新应用,由于在输出文件的设计上,采用了一些定式的方式,因此,每个项目的多个revit文件都可以按照相同方式进行输出并存储在同一个文件夹中。
根据上述特征,本发明方法提出了一个全新的文件展示方法,即将unity输出程序输出成一个可以读取定制几何数据并自动生成模型的展示程序。
unity展示程序的传统制作流程是将unity可以读入几何数据的文件(通常为fbx)导入到asset文件夹中,unity在导出成可执行程序前,现将fbx进行unity编辑状态下的几何数据导入并生成可视化的几何数据,再将这个可视化数据置入场景中;如果遇到像本发明方法中的所提及的非fbx几何数据文件,则可以通过使用脚本,在编辑阶段将几何数据导入到asset或直接导入到场景中,形成mesh对象并附着对应的材质。在完成上述步骤后,添加相机、动作控制器、光源、效果处理,然后将场景输出。这种方式带来一个问题,每当有这样的输出需求时,都必须经过unity编辑器,让其成为转换几何数据成为unity中mesh对象的必然工具。
本发明方法改变了传统的制作流程,现将转换的脚本程序附着在一个初始化即存在的物体上,比如摄像机或空物体,但并不执行转换,而是在程序中指定一个转换的相对目录,或是启用System.Windows.Forms的方法,使使用者可以选择需要导入的几何文件(本发明方法中是JSON文件),其后在编辑器中添加摄像机、光源、动作控制器(操控相机)、画板canvas、添加后期效果(本发明方法使用unity的通用渲染管线)等,输出成为可执行文件。
该方法的优势在于unity的展示程序不再专门为单一项目的revit输出文件进行展示制作,所有通过本发明所述revit输出几何文件的revit工程都可以适配同一个unity展示程序,unity的程序员不用再参与单一revit工程项目展示制作工作,只需要分发给需要展示的使用者输出好的展示程序就可以打开数据文件进行展示。
为了实现上述功能需要进行以下操作:
(1)制作预加载脚本文件,在脚本中将加载的模型文件名作为变量,变量的赋值可以是相对于输出可执行文件的相对路径+固定加载文件名,或者使用usingSystem.Windows.Forms命名空间,调用Windows.Forms方法,在脚本执行过程中打开文件选择框,让使用者自主选择。脚本中调用JSON支持库,读取JSON对象,根据对象名称批量将几何数据转换成unity内部的MeshFilter对象,并且将mesh对应的材质数据转成unity内部的Material对象,本发明方法中使用unity的通用渲染管线(urp),因此需要在resource目录下新建一个通用的着色器shader,在建立Material对象时,将这个着色器作为Material的着色器,这一步至关重要,是影响批量预加载的关键步骤,也是本发明方法中的重要环节。本脚本的程序段如果是采用相对路径的方法,则需要放置在Awake()或Shart()过程中,如果采用Windows.Forms方式选择文件则可以拓展至Update()过程中,通过快捷键或是canvas的按钮触发。
(2)将上述预加载脚本挂载在一个初始化便随场景出现的物体上,最简单的方式即为创建一个空物体,将脚本挂载在其上。
(3)加光源和摄像机
(4)为控制摄像机编写脚本,通过键盘或鼠标控制摄像机的位置、角度变化。
(5)加后期效果:首先添加全局光照处理,再添加urp下的天空盒效果。
(6)添加canvas,在canvas上添加若干空按钮,作为相机速至按钮,再添加动作控制按钮,比如前进、停止等。在(2)中创建的空物体上再挂载一个脚本,将动作控制的代码写入该脚本,速至按钮动作触发也是本发明的一个特点,由于速至的坐标是根据revit工程文件中的场景坐标而定的,在输出成展示程序之前,是无法固化的,因此,本发明方法提出了一个速至按钮的速至坐标外置文件,存储于几何数据文件夹中,在脚本执行时,也一并读入这个外置文件,并将外置文件中写入的速至坐标读取并赋予触发的按钮中,速至的名称也一并读取并写入canvas按钮之上,这就实现了动态管理场景的目标。
(7)编写一个程序,程序的功能如下:调用Windows.Forms,让程序使用者在文件选择框中选择所有通过插件输出的非几何数据文件(JSON格式),一个项目多个revit文件,则放置在一个文件夹中,将读取到的非几何数据文件的路径名写入一个新建的txt文本文件,一行一个非几何文件,存储在与非几何数据文件夹相同的文件夹中,并统一一个名称,如allinone.txt。
(8)根据(7)中内容,修改(1)中的脚本程序,让相对的文件夹+固定的文件名称,指向为(7)中规定好的txt,分别读取txt文本中的路径名提供给转换脚本的文件变量;如果是采用Windows.Forms,则文件指向为txt文本,也读取txt文本中的路径名,提供给脚本转换程序中的文件变量,进行几何转换。
(9)在(2)中的脚本中加入是否经过轻量化数据处理的判断,判断各自revit输出文件夹下有无“轻量化”文件夹,如果有,则按轻量化的文件夹中的几何数据进行导入。
(10)输出成可执行文件。
本发明中的方法对通州副中心枢纽站施工模型进行了输出,施工模型为154个revit文件(rvt文件),大小为4.7G数据量,分别对其进行了0-7级lod的输出,输出后分别按发明方法中提出的轻量化模型进行轻量化,得到对应的几何数据,如下表所示。将上述几何数据用unity封装的数据进行打开操作,对比处理前后的效果,unity漫游帧率得到提升。从可以正常显示也可以说明本方法是可行的方法,从帧率提升方面看,证明轻量化数据是有效的。
本发明方法在几种场景下的应用:
通州副中心枢纽站的施工模型:154个revit文件,数据总量为4.7G,按0-7级lod进行输出,以4级lod为例,输出顶点总数为1.014亿,三角面片数为1.465亿,通过轻量化方法进行处理后,顶点总数为0.774亿,三角面片数为1.14亿;轻量化前的漫游帧率为4-10帧不等,轻量化后的帧率为8-15帧不等。如图7所示,为4级轻量化后在unity程序中呈现的成果,此效果为内置渲染管线呈现的效果,非通用渲染管线输出的效果。
某车站轨枕系统模型:1个revit文件,数据量为147M,按4级lod导出,输出顶点8384万,三角面片1.27亿,处理后顶点总数为1571万,三角面片数为2273万,处理前帧率为40帧,处理后帧率蹿升至100帧,轨枕基本无变形,如图8所示。
新航城车站模型也按方法进行了相应的输出,并未进行数据对比,如图9所示。
本发明可以按照以上实施例实施,但其应用范围不限于此。以上实施例只是解释本发明在某种特定情况下的具体实施方式,但不能因此限定本发明的应用范围。
Claims (9)
1.一种在unity程序制作中输出模型数据的方法,使用Autodesk提供的revit二次开发接口-IExportContext,通过编写上下文的参数和在上下文的过程中加入对数据的提取和处理等方法,进行全部目标数据的输出,包括以下步骤:
步骤Start(),需要初始化数据字典、上下文实例,并存储项目信息、项目所有标高信息集合、项目基点信息等;
步骤OnViewBegin(),用来设置和存储LOD(模型精细度)信息;
步骤OnElementBegin(),获得输出几何单元(构件Element)的ID值,即ElementId,该值用以获得模型中构件的ID值;
步骤OnMaterial(),根据当前ElementId所对应的模型构件获取这个构件中的所有MaterialNode,再根据每个node节点得到对应的Material材质的UniqueId和针对材质的一系列信息;
步骤OnFaceBegin(),以facenode对象作为参数,获得face节点;
步骤OnPolymesh(),以PolymeshTopology为对象参数,获得最小物体单元的所有顶点数据、面数据、法线数据和UV数据;
步骤OnElementEnd(),以ElementId为参数,将完成所有输出数据的准备工作,其中包括顶点和顶点序列的数据处理、顶点法线和法线序列的数据处理、顶点UV的计算处理、自定义数据的获取;
步骤OnViewEnd(),结束对View对象的调用;
步骤Finish(),将所有已经准备好的数据进行JSON文件的输出。
2.如权利要求1所述的方法,其中,在步骤OnViewBegin()中,用户在启动输出程序的界面上设置从0-15级的某一个级别的LOD进行这个精细度下输出。
3.如权利要求1所述的方法,其中,在步骤OnElementBegin()中,通过该值进行模型的检索和调用,并获取构件的UniqueId,以防止ElementId重名。
4.如权利要求1所述的方法,其中,在步骤OnMaterial()中,一系列信息包括:漫反射颜色ambient(即为该材质的代表颜色)、透明度、纹理坐标、纹理文件和纹理文件的路径等。
5.如权利要求1所述的方法,其中,在步骤OnPolymesh()中,最小物体单元为ElementUniqueId+“_”+Material UniqueId物体。
6.如权利要求1所述的方法,其中,在步骤OnPolymesh()中,建立几何输出数据的方式为:首先将顶点集合进行去重操作,得到去重后的pts顶点集合和相应的字典;调用PolymeshTopology.GetFacets(),遍历所有得到的Facet(基础几何单元中的面片),将Facet的顶点与pts顶点字典建立查询关系,将查询到的字典位置数按遍历facet的顺序和facet自身排列的顶点顺序进行排列和存储,从而得到mesh所有点对应facet面的顶点序列;在遍历所有facet时,根据DistributionOfNormals参数的值判断facet记录法线向量的方法,当取值为OnePerFace或OnEachFacet时,将三个顶点的法线向量值取为物体或当前面的第一个顶点的取值,当取值为AtEachPoint时,则按facet的顶点顺序获得顶点法线向量的值,根据不同方式的顶点法线取值获得一个顶点法线向量的集合和字典;在遍历所有facet时,通过PolymeshTopology.GetUVs()获取每个顶点对应的UV值,该值的物理意义是对应这个facet面使用的纹理文件的纹理坐标值,并非传统意义上是uvw坐标系统的相对坐标值,将此值的集合建立uv集合和字典。
7.如权利要求1所述的方法,其中,在步骤OnElementEnd()中,在生成mesh对应的完整的uv集合前,将OnPolymesh()过程方法中得到的每个对应基础几何单元的uv集合中的uv坐标值与这个基础几何单元该facet面对应的纹理文件总像素坐标值进行同一坐标轴的相除求余计算,并替换原有的uv集合,再去重并计算序列数据,最终得到UV数组和UV序列数组,以此完成所有几何信息的准备工作。
8.如权利要求1所述的方法,其中,在步骤OnElementEnd()中,每个基础几何单元的自定义数据都是相同的,都对应的是ElementId,同一个ElementId下的所有基础几何单元的材质信息和几何信息都不一定相同。
9.如权利要求1所述的方法,其中,在步骤Finish()中,使用Newtonsoft.Json库文件进行JSON数据的输出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211721891.0A CN115964025A (zh) | 2022-12-30 | 2022-12-30 | 一种在unity程序制作中输出模型数据的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211721891.0A CN115964025A (zh) | 2022-12-30 | 2022-12-30 | 一种在unity程序制作中输出模型数据的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115964025A true CN115964025A (zh) | 2023-04-14 |
Family
ID=87363161
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211721891.0A Pending CN115964025A (zh) | 2022-12-30 | 2022-12-30 | 一种在unity程序制作中输出模型数据的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115964025A (zh) |
-
2022
- 2022-12-30 CN CN202211721891.0A patent/CN115964025A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7808501B2 (en) | Method of shading using sample vectors | |
Bracci et al. | HexaLab. net: An online viewer for hexahedral meshes | |
US6154215A (en) | Method and apparatus for maintaining multiple representations of a same scene in computer generated graphics | |
US8352443B1 (en) | Representing scene description in databases | |
US8983805B2 (en) | Modeled object updating | |
KR100928192B1 (ko) | 내장형 디바이스에서의 3d 콘텐츠에 대한 오프라인 최적화파이프라인 | |
KR100503789B1 (ko) | 렌더링시스템, 렌더링방법 및 그 기록매체 | |
CN112785696A (zh) | 基于游戏引擎和倾斜摄影数据的三维实景模型生成方法 | |
CN115062188A (zh) | 一种建筑数字孪生数据的存储方法 | |
Chen et al. | A cross-platform metaverse data management system | |
CN109858059B (zh) | 基于cad超大模型的虚拟现实技术在水电站仿真的应用方法 | |
CN114329274A (zh) | 基于产业应用的WebVR应用方法 | |
US11625900B2 (en) | Broker for instancing | |
CN115964025A (zh) | 一种在unity程序制作中输出模型数据的方法 | |
Mateo et al. | Hierarchical, Dense and Dynamic 3D Reconstruction Based on VDB Data Structure for Robotic Manipulation Tasks | |
CN114590366B (zh) | 一种船舶结构有限元分析结果虚拟可视化系统 | |
CN115904331A (zh) | 一种在unity程序制作中JSON的使用设计方法 | |
EP2715564B1 (en) | Mesh sequence file format | |
Cignoni et al. | Zeta: A resolution modeling system | |
WO2021222697A1 (en) | Method and apparatus for structural design | |
CN113888701A (zh) | 将曲面3D模型转化为Obj格式的网格3D模型的方法及系统 | |
CN116226969A (zh) | 一种在unity程序制作中数据轻量化的方法 | |
CN116012533A (zh) | Revit输出json文件并在unity3d等三维引擎中展示和管理的方法 | |
CN116011074A (zh) | 一种在unity程序制作中unity的展示方法 | |
US6567082B1 (en) | Incremental resolution changes in multi-resolution meshes with update records |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |