一种生成静态网格模型的方法与流程



1.本发明涉及计算机图形渲染领域,具体涉及一种生成静态网格模型的方法。


背景技术:



2.当前生成静态网格模型的方式有很多,例如:从外部导入模型、由其他组件转换生成等。但上述方式在生成静态网格模型之后,并不支持修改静态网格模型信息。
3.虚幻引擎ue4.25版本支持了在运行时更新静态网格模型,这为需要服务器传送模型顶点信息、到本地实时创建模型的实现成为可能。但虚幻引擎没有提供直接使用顶点相关信息运行时生成静态网格模型的方法。


技术实现要素:



4.针对上述存在的拘束局限性,本发明提出了种生成静态网格模型的方法,。
5.为实现上述目的,本发明采用了以下技术方案:一种生成静态网格模型的方法,所述方法包括以下步骤:步骤1、获取输入模型数据;所述输入模型数据由顶点数组、uv数组、点序数组组成;步骤2、当所述输入模型数据有效时,初始化构建结构体fmeshdescription;步骤3、根据所述输入模型数据设置所述构建结构体;步骤4、创建空的静态网格对象;所述静态网格对象为虚幻引擎中的ustaticmesh类对象,用于保存静态网格模型数据与渲染数据;步骤5、生成空的碰撞数据;步骤6、设置构建参数;所述构建参数为虚幻引擎中的fbuildmeshdescriptionsparams结构体;步骤7、调用构建网格描述函数,传入构建结构体fmeshdescription数据与构建参数结构体,从而构建出静态网格对象模型数据。
6.本发明与现有技术相对比,本发明具有以下优点:(1)可实现直接使用顶点相关信息在运行时生成静态网格模型;(2)不经过编辑器函数处理,因此生成时间相对较短,数据复杂度较低,方法效率高。
7.上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其他目的、特征和优点能够更明显易懂,以下特举较佳实施例,并配合附图,详细说明如下。
附图说明
8.图1为本发明实施例提供的一种生成静态网格模型的方法的步骤图。
9.图2为本发明实施例提供的一种设置构建结构体的方法的步骤图。
具体实施方式
10.以下由特定的具体实施例说明本发明的实施方式,熟悉此技术的人士可由本说明书所揭露的内容轻易地了解本发明的其他优点及功效,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。为了进一步了解本发明,下面结合最佳实施例对本发明作进一步的详细说明。
11.本发明的发明点是提供一种生成静态网格模型的方法;参考图1,所述方法包括以下步骤:步骤1、获取输入模型数据,并判断所述输入模型数据是否有效;所述输入模型数据为从外部建模软件(如may/max)导出的模型数据,所述输入模型数据由顶点数组、uv数组、点序数组组成;步骤2、当判断所述输入模型数据无效,则返回空指针对象并结束步骤;当判断所述输入模型数据有效时,初始化构建结构体fmeshdescription;所述构建结构体是构建静态网格时需要的数据结构,用于保存fbx文件解析数据;步骤3、根据所述输入模型数据设置所述构建结构体;步骤4、创建空的静态网格对象;所述静态网格对象为虚幻引擎中的ustaticmesh类对象,用于保存静态网格模型数据与渲染数据;步骤5、生成空的碰撞数据;步骤6、设置构建参数;所述构建参数为虚幻引擎中的fbuildmeshdescriptionsparams结构体,用于定义传递给构建网格描述函数(buildfrommeshdescriptions)的参数;步骤7、调用构建网格描述函数,传入构建结构体fmeshdescription数据与构建参数结构体,从而构建出静态网格对象模型数据;步骤8、输出步骤7所构建的静态网格对象模型数据。
12.步骤1中,判断所述输入模型数据是否有效的方法为:所述输入模型数据中的顶点数组、uv数组、点序数组均不为空,且所述顶点数组元素数量与所述uv数组元素数量相等。
13.参考图2,步骤3中,根据所述输入模型数据设置所述构建结构体的具体方法包括:步骤31、读取所述输入模型数据得到输入模型参数值,创建空的构建结构体fmeshdescriptin对象meshdescription;所述输入模型参数值包括:顶点位置数组invertexs、点序号数组inindices、顶点uv数组inuvs;步骤32、通过fstaticmeshattributes工具类提取meshdescription中的属性;步骤33、创建多边形组并指定默认材质;步骤34、初始化meshdescription的顶点、顶点实例、多边形、边与uv通道数;步骤35、将所述输入模型数据中的顶点位置数组数据复制到meshdescription中;
步骤36、根据所述输入模型数据中点序号数组为其中每个顶点序创建顶点实例;所述顶点实例中保存了对应顶点的uv、法线、切线、副法线,顶点颜信息,每个顶点实例都对应于meshdescription的vertexpositions数组中的一个顶点id。
14.步骤37、为多边形组创建多边形;步骤38、重新生成所有顶点与多边形的法线、切线、副法线;此时的meshdescription即为设置完成的构建结构体fmeshdescription。
15.步骤4中,所述静态网格对象包含两个成员变量,分别为:静态网格体原模型数据staticmeshsourcemodel及静态网格体渲染数据fstaticmeshrenderdata。
16.其中所述静态网格体原模型数据staticmeshsourcemodel用于保存顶点、uv、法线、点序等信息,该变量的数据来源于步骤3得到的构建结构体fmeshdescripion;所述静态网格体渲染数据staticmeshrenderdata由lod资源数组及顶点工厂数组组成,用于存储渲染信息,所述渲染信息为ustaticmesh的每一层lod的渲染信息;其中lod资源数组包含了所有lod层的fstaticmeshlodresources(即lod资源数据),lod资源数据包含了顶点缓存及若干索引数组。
17.传统方案中,所述静态网格体渲染数据staticmeshrenderdata通过以下步骤得到:当步骤3获得设置完成的构建结构体fmeshdescription后,调用编辑器函数ustaticmesh::build,由fmeshdescription生成所述静态网格体渲染数据staticmeshrenderdata。
18.但编辑器函数ustaticmesh::build是基于编辑器状态下的,运行时是不会执行的,而且生成过程消耗的计算机性能比较大,生成时间根据资产数据复杂度而变得很长。
19.本发明方案没有经过编辑器函数ustaticmesh::build,即没有编辑器的流程,故可以实现游戏打包,即运行状态下可以使用。
20.作为一种实施例,步骤5的生成空的碰撞数据通过以下方式实现:调用步骤4中所创建的静态网格对象的createbodysetup函数,生成ubodysetup结构体。
21.所述ubodysetup用于保存静态物理数据,运行时会产生真正的物理数据。
22.所述ubodysetup结构体主要参数及参数值如下:(1)bgeneratemirroredcollision(bool类型),用于表征是否生成必要的数据来支持该静态网格对象的镜像版本的碰撞。本方法中,由于不会使用镜像网格,故该参数设置为false。
23.(2)bdoublesidedgeometry(bool类型),用于表征是否物理三角形网格在进行场景查询时使用双面。本方法中,为防止模型为平面或单面时出现程序错误,故该参数设置为true。
24.(3)bodysetupguid,用于唯一标识当前ubodysetup。本方法调用fguid::newguid方法生成guid作为该参数的参数值。
25.(4)collisiontraceflag(枚举值),用于表征碰撞检测类型。本方法中,该参数设置为ctf_usecomplexassimple;该值表示只创建复杂碰撞,对所有场景查询和碰撞测试使用复杂碰撞。
26.作为一种实施例,步骤5生成空的碰撞数据后,还包括:调用步骤4中所创建的静态网格对象的createphysicsmeshes方法,生成physicsmeshe,为生成运行时真正物理数据做准备。
27.作为一种实施例,步骤6中fbuildmeshdescriptionsparams结构体的主要参数设置方法(即构建参数的主要设置方式)为:(1)是否快速构建参数(bool类型):当该参数设置为false时,会使用编辑器代码导致不能打包;本方法中动态创建必须为快速构建,故该参数设置为true;(2)是否构建简单碰撞参数(bool类型):本方法需要构建简单碰撞,故该参数设置为true;(3)是否允许cpu访问(bool类型):本方法需要在运行时创建静态网格模型,故该参数设置为true;除上述参数值外,fbuildmeshdescriptionsparams结构体的其余参数均采用默认值。
28.作为一种实施例,步骤7具体包括以下步骤:步骤71、创建临时fmeshdescription数组,并调用emplace函数将步骤3得到的构建结构体添加至所述临时fmeshdescription数组中步骤72、将所述临时fmeshdescription数组与步骤6得到的所述构建参数传入buildfrommeshdescriptions方法中,得到构建完成的静态网格对象模型数据。
29.作为一种实施例,步骤32中所提取的meshdescription中的属性包括:polygongroupnames(多边形组名数组引用),表示每个多边形组材质的名称;vertexpositions(顶点位置数组引用),表示每个顶点的位置;tangents(切线数组引用)表示每个顶点的切线向量;binormalsigns(副法线数组引用)表示每个顶点的副法线;normals(法线数组引用)表示每个顶点的切线向量;colors(顶点颜数组引用)表示每个顶点的顶点颜;uvs(顶点的uv数组引用)表示每个顶点的uv。
30.作为一种实施例,步骤33中,创建多边形组并指定默认材质具体方式为:调用meshdescription的createpolygongroup方法创建空的多边形组,并将该方法返回的组id保存到newpolygongroup变量中;通过umaterial::getdefaultmaterial方法获得虚幻默认材质,并将所述虚幻默认材质的名称保存到polygongroupnames[newpolygongroup]中;其中polygongroupnames[newpolygongroup]表示polygongroupnames数组中下标为newpolygongroup的元素;polygongroupnames通过步骤32获得。
[0031]
作为一种实施例,步骤34的具体实现方式为:将所述输入模型参数值中的顶点位置数组的元素数量,保存到vertexcount变量中;将所述输入模型参数值中的顶点位置数组的元素数量,保存到vertexinstancecount变量中;将vertexinstancecount变量的值除以3,保存到polygoncount变量中;
调用meshdescription的reservenewvertices方法,传入参数为vertexcount,从而设置初始化顶点数组个数为vertexcount;调用meshdescription的reservenewvertexinstances方法,传入参数为vertexinstancecount,从而设置初始化顶点实例数组个数为vertexinstancecount;调用meshdescription的reservenewpolygons方法,传入参数为polygoncount,从而设置初始化多边形数组个数为polygoncount;调用meshdescription的reservenewedges方法,传入参数为polygoncount*2,从而设置初始化边数组个数为polygoncount*2;调用meshdescription的uvs.setnumchannels方法,传入参数为4,从而设置初始化uv通道为4个。
[0032]
作为一种实施例,步骤35中将所述顶点位置数组复制到meshdescription中的具体实现方法包括以下步骤:步骤351、调用meshdescription的createvertex方法创建空顶点,并将所述空顶点的id保存至变量vertexid中;步骤352、将此时的顶点数据赋值给vertexpositions[vertexid](表示meshdescription的vertexpositions数组的第vertexid位置的元素);步骤353、返回步骤352,将下一个顶点数据赋值给meshdescription的vertexpositions数组中相应位置的元素,直到所述顶点位置数组中的所有顶点数据都复制到meshdescription中。
[0033]
作为一种实施例,步骤35还包括:创建映射(map)vertexindextovertexid,该映射用于保存invertexs数组顶点编号与meshdescription中创建的顶点id的对应关系。
[0034]
作为一种实施例,步骤36具体包括以下步骤:步骤361、获取当前顶点的顶点号,保存至变量vertexindex中;步骤362、借助vertexindextovertexid映射获得meshdescription中与vertexindex所代表顶点相对应的顶点id,保存到变量vertexid中;步骤362、调用meshdescription的createvertexinstance函数,传入vertexid,创建空的顶点实例并得到对应的顶点实例id,将所述顶点实例id保存至变量vertexinstanceid中;此时便创建出对应顶点的法线数组元素、切线数组元素、副法线数组元素、顶点颜数组元素及uv数组,分别为tangents[vertexinstanceid]、normals[vertexinstanceid]、binormalsigns[vertexinstanceid]、colors[vertexinstanceid]、uvs;步骤363、为当前顶点对应的法线数组元素、切线数组元素、副法线数组元素、顶点颜数组元素、uv数组赋值,具体赋值方式为:tangents[vertexinstanceid]赋值为(1.f,0.f,0.f),即默认切线;normals[vertexinstanceid]赋值为(0.f,0.f,1.f),即法线默认向上;binormalsigns[vertexinstanceid]赋值为1.f;colors[vertexinstanceid]赋值为(255,255,255),即颜为白;
uv数组(uvs)的四个通道均设置为inuvs[vertexindex]的值(即所述顶点uv数组中第vertexindex个元素的值);步骤364、返回步骤361,直到所述顶点位置数组invertexs中的每个顶点位置(即每个顶点)均创建完成相应的顶点实例。
[0035]
作为一种实施例,步骤36还包括:创建映射(map)indiceindextovertexinstanceid,该映射用于保存点序号数组inindices元素下标及与之对应的meshdescription中创建的顶点实例id。
[0036]
作为一种实施例,步骤37具体包括以下步骤:步骤371、创建类型为fvertexinstanceid的数组vertexinstanceids并初始化个数为3;步骤372、将当前顶点实例id及后两个连续的顶点实例id保存至数组vertexinstanceids中;步骤373、调用meshdescription的createpolygon方法、传入数组vertexinstanceids从而生成多边形;步骤374、返回步骤371,直到所有多边形生成完毕。
[0037]
作为一种实施例,步骤38中通过computetriangletangentsandnormals方法及computetangentsandnormals方法实现重新生成所有顶点与多边形的法线、切线、副法线,具体实现方法为本技术领域的常规技术手段,在此不再赘述。
[0038]
作为一种实施例,本发明所述方法可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(asic)、通用计算机或任何其他类似硬件设备来实现。
[0039]
本发明所述的方法可以软件程序的形式实施,所述软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,所述软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,ram存储器,磁或光驱动器或软磁盘及类似设备。
[0040]
另外,本发明所述方法的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
[0041]
另外,本发明所述的方法的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本技术的方法和/或技术方案。而调用本发明所述方法的程序指令,可被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。
[0042]
作为一种实施例,本发明还提供一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述的多个实施例的方法和/或技术方案。
[0043]
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于可选实施例,所涉及的动作和模块并不一定是本技术所必须的。
[0044]
最后,需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一
个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
[0045]
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

技术特征:


1.一种生成静态网格模型的方法,其特征在于,所述方法包括以下步骤:步骤1、获取输入模型数据;所述输入模型数据由顶点数组、uv数组、点序数组组成;步骤2、当所述输入模型数据有效时,初始化构建结构体fmeshdescription;步骤3、根据所述输入模型数据设置所述构建结构体;步骤4、创建空的静态网格对象;所述静态网格对象为虚幻引擎中的ustaticmesh类对象,用于保存静态网格模型数据与渲染数据;步骤5、生成空的碰撞数据;步骤6、设置构建参数;所述构建参数为虚幻引擎中的fbuildmeshdescriptionsparams结构体;步骤7、调用构建网格描述函数,传入构建结构体fmeshdescription数据与构建参数结构体,从而构建出静态网格对象模型数据。2.根据权利要求1所述的方法,其特征在于,步骤3中,根据所述输入模型数据设置所述构建结构体的具体方法包括:步骤31、读取所述输入模型数据得到输入模型参数值,创建空的构建结构体fmeshdescriptin对象meshdescription;所述输入模型参数值包括:顶点位置数组invertexs、点序号数组inindices、顶点uv数组inuvs;步骤32、通过fstaticmeshattributes工具类提取meshdescription中的属性;步骤33、创建多边形组并指定默认材质;步骤34、初始化meshdescription的顶点、顶点实例、多边形、边与uv通道数;步骤35、将所述输入模型数据中的顶点位置数组数据复制到meshdescription中;步骤36、根据所述输入模型数据中点序号数组为其中每个顶点序创建顶点实例;步骤37、为多边形组创建多边形;步骤38、重新生成所有顶点与多边形的法线、切线、副法线;此时的meshdescription即为设置完成的构建结构体fmeshdescription。3.根据权利要求1所述的方法,其特征在于,步骤5的生成空的碰撞数据通过以下方式实现:调用步骤4中所创建的静态网格对象的createbodysetup函数,生成ubodysetup结构体;所述ubodysetup用于保存静态物理数据;步骤5生成空的碰撞数据后,还包括:调用步骤4中所创建的静态网格对象的createphysicsmeshes方法,生成physicsmeshe。4.根据权利要求1所述的方法,其特征在于,步骤7具体包括以下步骤:步骤71、创建临时fmeshdescription数组,并调用emplace函数将步骤3得到的构建结构体添加至所述临时fmeshdescription数组中;步骤72、将所述临时fmeshdescription数组与步骤6得到的所述构建参数传入buildfrommeshdescriptions方法中,得到构建完成的静态网格对象模型数据。
5.根据权利要求2所述的方法,其特征在于,步骤33中,创建多边形组并指定默认材质具体方式为:调用meshdescription的createpolygongroup方法创建空的多边形组,并将该方法返回的组id保存到newpolygongroup变量中;通过umaterial::getdefaultmaterial方法获得虚幻默认材质,并将所述虚幻默认材质的名称保存到polygongroupnames[newpolygongroup]中;其中polygongroupnames[newpolygongroup]表示polygongroupnames数组中下标为newpolygongroup的元素;polygongroupnames通过步骤32获得。6.根据权利要求2所述的方法,其特征在于,步骤34的具体实现方式为:将所述输入模型参数值中的顶点位置数组的元素数量,保存到vertexcount变量中;将所述输入模型参数值中的顶点位置数组的元素数量,保存到vertexinstancecount变量中;将vertexinstancecount变量的值除以3,保存到polygoncount变量中;调用meshdescription的reservenewvertices方法,传入参数为vertexcount,从而设置初始化顶点数组个数为vertexcount;调用meshdescription的reservenewvertexinstances方法,传入参数为vertexinstancecount,从而设置初始化顶点实例数组个数为vertexinstancecount;调用meshdescription的reservenewpolygons方法,传入参数为polygoncount,从而设置初始化多边形数组个数为polygoncount;调用meshdescription的reservenewedges方法,传入参数为polygoncount*2,从而设置初始化边数组个数为polygoncount*2;调用meshdescription的uvs.setnumchannels方法,传入参数为4,从而设置初始化uv通道为4个。7.根据权利要求2所述的方法,其特征在于,步骤35包括以下步骤:步骤351、调用meshdescription的createvertex方法创建空顶点,并将所述空顶点的id保存至变量vertexid中;步骤352、将此时的顶点数据赋值给meshdescription的vertexpositions数组的第vertexid位置的元素;步骤353、返回步骤352,将下一个顶点数据赋值给meshdescription的vertexpositions数组中相应位置的元素,直到所述顶点位置数组中的所有顶点数据都复制到meshdescription中。8.根据权利要求2所述的方法,其特征在于,步骤36具体包括以下步骤:步骤361、获取当前顶点的顶点号,保存至变量vertexindex中;步骤362、获得meshdescription中与vertexindex所代表顶点相对应的顶点id,保存到变量vertexid中;步骤362、调用meshdescription的createvertexinstance函数,传入vertexid,创建空
的顶点实例并得到对应的顶点实例id,将所述顶点实例id保存至变量vertexinstanceid中;步骤363、为当前顶点对应的法线数组元素、切线数组元素、副法线数组元素、顶点颜数组元素、uv数组赋值;步骤364、返回步骤361,直到所述顶点位置数组invertexs中的每个顶点位置均创建完成相应的顶点实例。9.根据权利要求2所述的方法,其特征在于,步骤37具体包括以下步骤:步骤371、创建类型为fvertexinstanceid的数组vertexinstanceids并初始化个数为3;步骤372、将当前顶点实例id及后两个连续的顶点实例id保存至数组vertexinstanceids中;步骤373、调用meshdescription的createpolygon方法、传入数组vertexinstanceids从而生成多边形;步骤374、返回步骤371,直到所有多边形生成完毕。10.根据权利要求2所述的方法,其特征在于,步骤38中通过computetriangletangentsandnormals方法及computetangentsandnormals方法实现重新生成所有顶点与多边形的法线、切线、副法线。

技术总结


本发明提出了一种生成静态网格模型的方法,所述方法包括:步骤1、获取输入模型数据;步骤2、当所述输入模型数据有效时,初始化构建结构体FMeshDescription;步骤3、根据所述输入模型数据设置所述构建结构体;步骤4、创建空的静态网格对象;所述静态网格对象为虚幻引擎中的UStaticMesh类对象,用于保存静态网格模型数据与渲染数据;步骤5、生成空的碰撞数据;步骤6、设置构建参数;步骤7、调用构建网格描述函数,传入构建结构体FMeshDescription数据与构建参数结构体,从而构建出静态网格对象模型数据;借由上述方法可实现直接使用顶点相关信息在运行时生成静态网格模型。在运行时生成静态网格模型。在运行时生成静态网格模型。


技术研发人员:

孙华庆 贾宏伟 郭建君

受保护的技术使用者:

北京蔚领时代科技有限公司

技术研发日:

2022.11.09

技术公布日:

2022/12/23

本文发布于:2024-09-23 01:33:05,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/47519.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:步骤   顶点   所述   数组
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议