首页 / 专利库 / 电脑图像 / 着色器 / 顶点着色器 / 三维OBJ模型及MTL材质在iPhone中的解析与渲染方法

三维OBJ模型及MTL材质在iPhone中的解析与渲染方法

阅读:1015发布:2020-06-09

专利汇可以提供三维OBJ模型及MTL材质在iPhone中的解析与渲染方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种三维OBJ模型及MTL材质在iPhone中的解析与 渲染 方法,包括以下步骤:读取OBJ模型定义文件和MTL材质定义文件;根据文件格式编写解析函数,将读入的数据解析为数组;创建OpenGL ES模型对象,并生成相应的.h头文件和.m实现文件;基于解析的OBJ模型数据,使用OpenGL ES绘制三维模型;基于解析的MTL材质数据,使用GLKit渲染模型并添加材质;在iPhone应用上展示。本发明使用的是目前通用的三维OBJ模型及MTL材质,实现了三维模型在iPhone设备上的载入与展示,具有广阔的应用前景。,下面是三维OBJ模型及MTL材质在iPhone中的解析与渲染方法专利的具体信息内容。

1.一种三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的解析与渲染方法包括以下步骤:
S1、读取OBJ模型定义文件和MTL材质定义文件;
S2、根据文件格式编写解析函数,将读入的数据解析为数组;
S3、创建OpenGL ES模型对象,并生成相应的.h头文件和.m实现文件;
S4、基于解析的OBJ模型数据,使用OpenGL ES绘制三维模型;
S5、基于解析的MTL材质数据,使用GLKit渲染模型并添加材质。
2.根据权利要求1所述的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的OBJ模型结构包括:顶点、法线、纹理坐标、面片、材质使用,其中,所述的顶点后接(x,y,z)三维坐标单精度浮点参数,分别表示顶点的X、Y、Z坐标值,以此指定一个顶点,以回车换行作为结尾;
所述的法线后接(x,y,z)三维坐标单精度浮点参数,分别表示法向量的X、Y、Z坐标值,以此指定一个法线向量,以回车换行作为结尾;
所述的纹理坐标后接两个单精度浮点参数,分别表示纹理坐标的U、V值,以此指定一个纹理坐标,以回车换行作为结尾;
所述的面片为一个三形小面片,用于指代一个表面,该三角形小面片由顶点、纹理坐标、法向量表示,以回车换行作为结尾;
所述的材质使用后接一个参数,该参数指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称,该材质在与OBJ文件关联的MTL文件中找到具体信息。
3.根据权利要求1所述的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的MTL材质文件结构包括:基础材质和纹理贴图,其中,
所述的基础材质,首先对材质进行定义,然后对材质进行设定,设定的前缀分别有Ka、Kd、Ks,分别指定材质的环境光成分、漫射光成分、镜面光成分,格式为“前缀参数1参数2参数3”,三个参数均为单精度浮点数;
所述的纹理贴图,由带纹理材质使用如上的基础材质定义,并额外定义纹理贴图,关键字前缀有map_Ka、map_Kd,
其中,map_Ka为环境反射指定颜色纹理文件.mpc、纹理文件.cxc或是一个位图文件,在渲染的时候,Ka的值将再乘上map_Ka的值;map_Kd为漫反射指定颜色纹理文件.mpc、纹理文件.cxc或是一个位图文件,在渲染的时候,Kd的值将再乘上map_Kd的值。
4.根据权利要求1所述的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的步骤S1过程如下:
S101、创建fstream读取OBJ和MTL文件;
S102、使用fstream的good函数判断文件读取是否成功,成功则转入下一步骤。
5.根据权利要求1所述的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的步骤S2过程如下:
S201、定义变量,其中,变量包括:用于存储定点个数的整型positionsCount,用于存储法线个数的整型normalsCount,用于存储纹理坐标个数的整型texelsCount,用于存储三角形面片个数的整型facesCount,用于存储材质信息个数的整型materialsCount;
S202、分别对读取的OBJ和MTL数据进行第一次逐行遍历,对OBJ数据逐行遍历时,识别相应的行前缀,统计得出定点、法线、纹理坐标和三角形面片的个数,并依次给变量positionsCount、normalsCount、texelsCount和facesCount赋值;对MTL数据逐行遍历时,识别相应的行前缀,统计得出材质信息的个数,给变量materialsCount赋值;
S203、利用步骤S202得到的数据个数,定义数组变量,其中,数组变量包括:
用于存储定点坐标信息的浮点数组positions[positionsCount][3],用于存储法线坐标信息的浮点数组texels[texelsCount][2],用于存储纹理坐标信息的浮点数组normals[normalsCount][3],用于存储三角形面片坐标信息的整型数组faces[facesCount][10],用于存储材质名称信息的字符串数组materials[materialsCount],用于存储漫射光成分信息的浮点数组diffuses[materialsCount][3],用于存储镜面光成分信息的浮点数组speculars[materialsCount][3];
S204、对OBJ数据和MTL数据进行第二次逐行遍历,匹配到前缀时,利用strtok函数以空格作为分隔符,将字段分割,然后依次写入到上述对应数组中进行存储。
6.根据权利要求1所述的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的步骤S3过程如下:
S301、根据步骤S2中得到的数据生成.h头文件和.m实现文件;
S302、定义.h头文件需要的属性,其中,属性包括:用于存储模型顶点坐标的浮点类型常量数组modelPositions,用于存储模型纹理坐标的浮点类型常量数组modelTexels,用于存储模型法向量坐标的浮点类型常量数组modelNormals,用于存储材质个数的整型常量modelMaterials,用于存储每一个face数组的开始顶点下标的整型常量数组modelFirsts,用于存储每一个材质要绘制顶点个数的整型常量数组modelCounts,用于存储漫射光坐标的浮点类型二维数组modelDiffuses,用于存储镜面光坐标的浮点类型二维数组modelSpeculars;
S303、将步骤S2中得到的二维数据降维至一维数据再由ofstream输出,得到.m实现文件。
7.根据权利要求1所述的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的步骤S4过程如下:
S401、创建GLKView实例对象,并初始化一个OpenGL ES context上下文环境;
S402、使用函数glEnableVertexAttribArray、函数glVertexAttribPointer和GLKit中定义的枚举类型GLKVertexAttribPosition、GLKVertexAttribNormal进行3D模型的绘制,其中,所用到的函数和枚举类型定义如下:
函数glEnableVertexAttribArray,用于启用某一项属性数组访问功能,该函数需要输入顶点属性数组下标,无返回值;函数glVertexAttribPointer,利用指针,将顶点数组的值读入绘制的context中,无返回值;枚举量GLKVertexAttribPosition,用于向着色器提供顶点数据;枚举量GLKVertexAttribNormal,用于向着色器提供法向量坐标点数据。
8.根据权利要求1所述的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,其特征在于,所述的步骤S5过程如下:
S501、使用GLKit中的GLKBaseEffect类为3D模型添加光学效果;
S502、利用生成的modelDiffuses数组和modelSpeculars数组为GLKBaseEffect实例对象添加材质的漫射光和镜面光效果。

说明书全文

三维OBJ模型及MTL材质在iPhone中的解析与渲染方法

技术领域

[0001] 本发明涉及图形处理技术领域,具体涉及一种三维OBJ模型及MTL材质在移动iPhone中的解析与渲染方法。

背景技术

[0002] 随着移动设备硬件性能的发展,移动智能终端逐渐成为人们生活中不可或缺的物品。与此同时,用户更希望在移动端的新应用上能够具有更加绚丽的展示形式和更加流畅的用户体验。而针对移动平台的图形渲染引擎OpenGL ES正是为了实现这一需求而被开发。
[0003] OpenGL ES(OpenGL for Embedded Systems)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。应用领域为视频、图形、图片处理,2D/3d游戏引擎开发,科学可视化等等。
[0004] 由于OpenGL ES开源且跨平台,iPhone设备的iOS系统也能够使用OpenGL ES的标准接口来支持3D图形功能。且结合原生的GLKit,可以实现高质量的图形显示效果及更加震撼的视觉冲击效果。
[0005] 当然,现代三维建模工具已经定义了许多种三维模型文件格式,如3DS、OBJ、MD2、MD3、MDL等等。目前亟待需要进一步研究通用和流行的OBJ模型格式和与其相关的MTL材质文件格式在iPhone设备中的应用。

发明内容

[0006] 本发明的主要目的在于满足移动设备上三维模型解析与渲染的需求,公开一种三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,克服OBJ三维模型文件无法直接在移动端上读取的技术难点,最终实现三维模型在iPhone设备上的载入与展示。
[0007] 本发明的目的可以通过采取如下技术方案达到:
[0008] 一种三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,所述的解析与渲染方法包括以下步骤:
[0009] S1、读取OBJ模型定义文件和MTL材质定义文件;
[0010] S2、根据文件格式编写解析函数,将读入的数据解析为数组;
[0011] S3、创建OpenGL ES模型对象,并生成相应的.h头文件和.m实现文件;
[0012] S4、基于解析的OBJ模型数据,使用OpenGL ES绘制三维模型;
[0013] S5、基于解析的MTL材质数据,使用GLKit渲染模型并添加材质。
[0014] 进一步地,所述的OBJ模型结构包括:(1)顶点、(2)法线、(3)纹理坐标、(4)面片、(5)材质使用,其中,
[0015] (1)顶点:后接(x,y,z)三维坐标单精度浮点参数,分别表示顶点的X、Y、Z坐标值,以此指定一个顶点。以回车换行作为结尾。
[0016] (2)法线:后接(x,y,z)三维坐标单精度浮点参数,分别表示法向量的X、Y、Z坐标值,指定一个法线向量。以回车换行作为结尾。
[0017] (3)纹理坐标:后接两个单精度浮点参数,分别表示纹理坐标的U、V值,以此指定一个纹理坐标。以回车换行作为结尾。
[0018] (4)面片:一个表面实际为一个三形小面片。该小面片由顶点下标、纹理坐标下标、法向量下标表示。以回车换行作为结尾。
[0019] (5)材质使用:后接一个参数,该参数指定了从此行之后到下一个以usemtl开头的行之间的所有表面所使用的材质名称。该材质在与OBJ文件关联的MTL文件中找到具体信息。
[0020] 进一步地,所述的MTL材质文件结构包括:(1)基础材质、(2)纹理贴图,其中,[0021] (1)基础材质:该部分首先对材质进行定义,然后对材质进行设定。设定的前缀分别有Ka、Kd、Ks,分别指定材质的环境光成分、漫射光成分、镜面光成分。格式为“前缀参数1参数2参数3”,三个参数均为单精度浮点数。
[0022] (2)纹理贴图:带纹理材质使用如上的基础材质定义,并额外定义纹理贴图。关键字前缀有map_Ka、map_Kd,其中map_Ka为环境反射指定颜色纹理文件(.mpc)或纹理文件(.cxc),或是一个位图文件。在渲染的时候,Ka的值将再乘上map_Ka的值;map_Kd为漫反射指定颜色纹理文件(.mpc)或纹理文件(.cxc),或是一个位图文件。作用原理与map_Ka相同。
[0023] 进一步地,所述的步骤S1过程如下:
[0024] S101、创建fstream读取OBJ和MTL文件;
[0025] S102、使用fstream的good函数判断文件读取是否成功,成功则转入步骤S2,否则,重复步骤S1。
[0026] 进一步地,所述的步骤S2过程如下:
[0027] S201、定义变量,其中,变量包括:
[0028] 用于存储定点个数的整型positionsCount,用于存储法线个数的整型normalsCount,用于存储纹理坐标个数的整型texelsCount,用于存储三角形面片个数的整型facesCount,用于存储材质信息个数的整型materialsCount;
[0029] S202、分别对读取的OBJ和MTL数据进行第一次逐行遍历。对OBJ数据逐行遍历时,识别相应的行前缀,统计得出定点、法线、纹理坐标和三角形面片的个数,并依次给变量positionsCount、normalsCount、texelsCount和facesCount赋值;对MTL数据逐行遍历时,方法同OBJ数据遍历,统计得出材质信息的个数,给变量materialsCount赋值;
[0030] S203、利用S202得到的数据个数,定义数组变量,其中,数组变量包括:
[0031] 用于存储定点坐标信息的浮点数组positions[positionsCount][3],用于存储法线坐标信息的浮点数组texels[texelsCount][2],用于存储纹理坐标信息的浮点数组normals[normalsCount][3],用于存储三角形面片坐标信息的整型数组faces[facesCount][10],用于存储材质名称信息的字符串数组materials[materialsCount],用于存储漫射光成分信息的浮点数组diffuses[materialsCount][3],用于存储镜面光成分信息的浮点数组speculars[materialsCount][3];
[0032] S204、对OBJ数据和MTL数据进行第二次逐行遍历。匹配到前缀时,利用strtok函数以空格作为分隔符,将字段分割,然后依次写入到上述对应数组中进行存储。至此,已将数据成功读入数组。
[0033] 进一步地,所述的步骤S3过程如下:
[0034] S301、OpenGL ES会以一维数组的形式对3D模型数据进行读取,以二维数组的形式对漫射光、镜面光数据进行读取。因此,为了便于使用OpenGL ES,先将S2中得到的数据生成.h头文件和.m实现文件;
[0035] S302、定义.h头文件需要的属性,其中,属性包括:
[0036] 用于存储模型顶点坐标的浮点类型常量数组modelPositions,用于存储模型纹理坐标的浮点类型常量数组modelTexels,用于存储模型法向量坐标的浮点类型常量数组modelNormals,用于存储材质个数的整型常量modelMaterials,用于存储每一个face数组的开始顶点下标的整型常量数组modelFirsts,用于存储每一个材质要绘制顶点个数的整型常量数组modelCounts,用于存储漫射光坐标的浮点类型二维数组modelDiffuses,用于存储镜面光坐标的浮点类型二维数组modelSpeculars;
[0037] S303、.m实现文件即为.h头文件的实现文件,只需要将S2中得到的二维数据降维至一维数据再由ofstream输出即可。
[0038] 进一步地,所述的步骤S4过程如下:
[0039] S401、创建GLKView实例对象,并初始化一个OpenGL ES context上下文环境;
[0040] S402、使用glEnableVertexAttribArray、glVertexAttribPointer等OpenGL ES中的函数和GLKit中定义的枚举类型GLKVertexAttribPosition、GLKVertexAttribNormal进行3D模型的绘制。其中,所用到的函数和枚举类型定义如下:
[0041] 函数glEnableVertexAttribArray,用于启用某一项属性数组访问功能,该函数需要输入顶点属性数组下标,无返回值;函数glVertexAttribPointer,利用指针,将顶点数组的值读入绘制的context中,无返回值;枚举量GLKVertexAttribPosition,用于向着色器提供顶点数据;枚举量GLKVertexAttribNormal,用于向着色器提供法向量坐标点数据。
[0042] 进一步地,所述的步骤S5过程如下:
[0043] S501、使用GLKit中的GLKBaseEffect类为3D模型添加光学效果;
[0044] S502、进一步利用生成的modelDiffuses数组和modelSpeculars数组为GLKBaseEffect实例对象添加材质的漫射光和镜面光效果。至此,完成了三维模型的渲染。
[0045] 本发明相对于现有技术具有如下的优点及效果:
[0046] 1)、本发明结合了强大的三维图形处理引擎OpenGL ES及流行的三维模型格式OBJ,能够在iPhone设备上实现更流畅、更丰富的图形效果。
[0047] 2)、本发明克服OBJ三维模型文件无法直接在移动端上读取的技术难点,最终实现三维模型在iPhone设备上的载入与展示,并且具有更快的模型文件载入与解析速度。附图说明
[0048] 图1是本发明中公开的三维OBJ模型及MTL材质在iPhone中的解析与渲染方法的原理框图
[0049] 图2是本发明中使用的OpenGL ES的框架结构示意图。

具体实施方式

[0050] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0051] 实施例
[0052] 如附图1所示,本实施例公开了一种三维OBJ模型及MTL材质在iPhone中的解析与渲染方法,包括以下步骤:
[0053] S1、读取OBJ模型定义文件和MTL材质定义文件。具体步骤如下:
[0054] 首先,创建fstream读取OBJ和MTL文件。
[0055] 然后,使用fstream的good函数判断文件读取是否成功,成功则继续下一步操作。
[0056] S2、根据文件格式编写解析函数,将读入的数据解析为数组。具体步骤如下:
[0057] 首先,定义变量,其中,变量包括:
[0058] 用于存储定点个数的整型positionsCount,用于存储法线个数的整型normalsCount,用于存储纹理坐标个数的整型texelsCount,用于存储三角形面片个数的整型facesCount,用于存储材质信息个数的整型materialsCount。
[0059] 然后,分别对读取的OBJ和MTL数据进行第一次逐行遍历。对OBJ数据逐行遍历时,识别相应的行前缀,统计得出定点、法线、纹理坐标和三角形面片的个数,并依次给变量positionsCount、normalsCount、texelsCount和facesCount赋值;对MTL数据逐行遍历时,方法同OBJ数据遍历,统计得出材质信息的个数,给变量materialsCount赋值。
[0060] 接着,利用读取文件得到的数据个数,定义数组变量,其中,数组变量包括:
[0061] 用于存储定点坐标信息的浮点数组positions[positionsCount][3],用于存储法线坐标信息的浮点数组texels[texelsCount][2],用于存储纹理坐标信息的浮点数组normals[normalsCount][3],用于存储三角形面片坐标信息的整型数组faces[facesCount][10],用于存储材质名称信息的字符串数组materials[materialsCount],用于存储漫射光成分信息的浮点数组diffuses[materialsCount][3],用于存储镜面光成分信息的浮点数组speculars[materialsCount][3]。
[0062] 最后,对OBJ数据和MTL数据进行第二次逐行遍历。匹配到前缀时,利用strtok函数以空格作为分隔符,将字段分割,然后依次写入到上述对应数组中进行存储。至此,已将数据成功读入数组。
[0063] S3、创建OpenGL ES模型对象,并生成相应的.h头文件和.m实现文件。具体步骤如下:
[0064] 首先,OpenGL ES会以一维数组的形式对3D模型数据进行读取,以二维数组的形式对漫射光、镜面光数据进行读取。因此,为了便于使用OpenGL ES,先将S2中得到的数据生成.h头文件和.m实现文件。
[0065] 然后,定义.h头文件需要的属性,其中,属性包括:
[0066] 用于存储模型顶点坐标的浮点类型常量数组modelPositions,用于存储模型纹理坐标的浮点类型常量数组modelTexels,用于存储模型法向量坐标的浮点类型常量数组modelNormals,用于存储材质个数的整型常量modelMaterials,用于存储每一个face数组的开始顶点下标的整型常量数组modelFirsts,用于存储每一个材质要绘制顶点个数的整型常量数组modelCounts,用于存储漫射光坐标的浮点类型二维数组modelDiffuses,用于存储镜面光坐标的浮点类型二维数组modelSpeculars。
[0067] 接着,.m实现文件即为.h头文件的实现文件,只需要将S2中得到的二维数据降维至一维数据再由ofstream输出即可。
[0068] S4、基于解析的OBJ模型数据,使用OpenGL ES绘制三维模型。具体步骤如下:
[0069] 首先,创建GLKView实例对象,并初始化一个OpenGL ES context上下文环境。
[0070] 然后,使用glEnableVertexAttribArray、glVertexAttribPointer等OpenGL ES中的函数和GLKit中定义的枚举类型GLKVertexAttribPosition、GLKVertexAttribNormal进行3D模型的绘制。其中,所用到的函数和枚举类型定义如下:
[0071] 函数glEnableVertexAttribArray,用于启用某一项属性数组访问功能,该函数需要输入顶点属性数组下标,无返回值;函数glVertexAttribPointer,利用指针,将顶点数组的值读入绘制的context中,无返回值;枚举量GLKVertexAttribPosition,用于向着色器提供顶点数据;枚举量GLKVertexAttribNormal,用于向着色器提供法向量坐标点数据。
[0072] S5、基于解析的MTL材质数据,使用GLKit渲染模型并添加材质。具体步骤如下:
[0073] 首先,使用GLKit中的GLKBaseEffect类为3D模型添加光学效果。
[0074] 然后,进一步利用生成的modelDiffuses数组和modelSpeculars数组为GLKBaseEffect实例对象添加材质的漫射光和镜面光效果。
[0075] 至此,完成了三维模型的渲染。
[0076] 上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈