首页 / 浏览问题 / 桌面GIS / 问题详情
GeoModel3D转换为三维几何体
6EXP 2022年05月30日
SuperMap idesktopX 11i二次开发,iObject java。数据源是.udbx文件,我操作的是三维模型数据集。我的疑问有:
1、如何将GeoModel3D对象(应该是底面通过拉伸,添加贴图后所得)转换为多个三维面(一个体的多个面,包括侧面,不只是被拉伸的底面)?或者能否先转成三维点,再构建多个三维面?请问具体的方法是什么,我是用iobject java写的。
又或者我的GeModel3D对象确实只有一个底面,Supermap iObject暂时不支持GeoModel3D按我的需求转成三维实体?
目前我只能用ModelBuilder3D.extractBorder方法提取到一个被拉伸的面,且是顶部的面,没有侧面。该函数的第二个参数:边界格式是投影,选拓扑则返回null。
2、GeoModel3D对象的数据结构问题。比如纹理、材质、骨架等信息如何存储的?难道是与底面多边形存储在一个Geometry字段,且数据类型为byte[],可读取为.zip文件?
3、我将该udbx文件在SuperMap中能打开并三维显示。但是如果直接拖入PostGIS库中,在球面场景中虽然能定位,但是不显示。是颜色透明度等渲染风格问题?还是SuperMap与PostGIS关于模型数据接口问题?
4、SuperMap向PostGIS中导入模型数据时,是直接将每条记录(包括Geometry字段)原封不动复制到PG表的吗,还是会有额外的处理?
是否意味着:如果我想将模型数据集存储为PG表,以便将来在前端调用渲染,那必须得自己设计表结构?有什么现有的可行思路吗?

问题比较多,恳请超相关研发人员解答,谢谢!很多官方文档和问答我都看过了,比如《空间三维数据标准》(大概是这个名字),还是没搞明白明白。有的帖子还被删了,请问是否有其他官方的文档或者学习途径?感觉SuperMap技术文档体系不完善,尤其连最基本的数据类型、数据结构,相关介绍几乎没有。这对于新手太不友好了。建议完善!

2 个回答

您好,首先在超图的数据结构关系中,GeoModel3D是三维模型对象,他是三维几何对象Geometry3D的子类,即它也属于三维几何体中的一种,不太理解您问的“GeoModel3D转换为三维几何体”具体是想做什么。

至于数据结构的问题,三维的数据形式不是gis领域独创的数据结构,而是现通用三维领域的引入,因此骨架、纹理、材质、晶洞、三角面这些概念和通用三维模型体系(骨架体系)一致而出的。

数据结构在不同操作层面的意义是不一样的在组件层面,比如模型本身由骨架、纹理、材质构成;

骨架由节点构成,可赋予这个模型所有的纹理、材质或顶点颜色等;

模型本身的这些都是在模型精细层内的东西,在精细层构建完毕后,可以对模型抽稀构建lod层,当然lod层也可以手动构建;

模型骨架的姿态操作平移、旋转、缩放等由4*4矩阵来操作;

模型的位置由定位中心坐标决定。

等等组件层来构造、运算、使用、优化、调整模型的方法属性,是在帮助文档中每一条属性方法都有的,数据的逻辑结构、关联继承关系、方法、属性等在帮助文档对应类中都是有描述的,普通业务的数据构造、优化、添加使用应该是足够了的,在GeoModel和Geometry这个层面,业务中应该并不需要解析数据底层的存储结构的。当然像瓦片数据、缓存数据这些在使用过程中存储结构会影响加载、优化、使用的情况,我们文档中也有说明解析这些是数据的存储层结构。

前端渲染的问题:

当前主流的使用方案路径是对场景或模型数据生产三维切片模型缓存后,发布该缓存三维服务在前端中加载;(主要数据绝大部分选择)

少部分特殊数据情况和业务特殊需求,对模型数据集发布数据服务,在前端中对该数据集服务查询得到需要模型的几何对象,

使用该数据在前端场景中构建模型实体来显示。(极少部分业务情况)

在以上一些前端业务流程中,应该都不涉及需要解析模型数据本身数据构成结构或者在数据库、文件中存储结构的问题。

看您问题里有提到“T/CAGIS 1—2019《空间三维模型数据格式》”,需要注意该技术标准是上方提到的gis三维生产最终数据“三维切片模型”的数据结构,并不是组件层Geometry3D或者GeoModel3D的是数据结构。

希望可以帮助到您。
于丁
2
10,513EXP 2022年05月31日
1、我现在的需求是:将模型转换成三维的线(这些线会构成一个闭合的体,而不是面)。所以我想知道具体该调用哪些方法?

2、我做的业务主要是三维模型的裁切、转点转线、PostGIS存储等,应该了解GeoModel3D的数据结构吧?
我是否可以这么理解:

GeoModel3D对象实际存储还是二维的面对象。之所以在SuperMap中有三维的渲染效果是因为设置了三维图层的风格,包括骨架、纹理、材质、拉伸高度等信息。且风格设置信息是由SuperMap本身提供的,不是数据集本身自带的,刚加载数据集到新图层就会使用默认的风格设置信息,后面用户可以手动修改?
转线建议直接取模型骨架里的顶点集Point3d来构建需要的GeoLine3D对象。

三维模型的裁剪、布尔运算都有直接的接口不用关注模型的存储结构,postgis型数据源使用iclient、isever、iDesktop、iobject等都是可以直接读写增删的。

postgis本身的读取其实更多取决于postgis的支持。
没有,完全不是的,上面和你说模型完全没有和你说过面或者拉伸高度的。

模型是骨架、纹理、材质构成的,和面没有关系的,三维模型体系,骨架体系、多边形面体系、块体系等其他是不同的体系,不能混为一谈,超图的模型是骨架体系的。

面数据集通过图层风格拉伸显示成立体白模,这是另一条三维立体显示路线和GeoModel3d没有关系的,这个路线是数据集是面数据集,只是在图层layer的style配置的一种立体显示风格,不是模型。

当然基于这个逻辑,使用规则建模里的拉伸建模,是可以通过拉伸高度和底部高程,将三维面数据集通过垂直拉伸的方式,建模构建成模型数据集的,构建后的模型数据集是模型数据结构的,不是面的。

至于显示内容这块,首先模型GeoModel3d这个Geometry几何对象的本身是有材质和纹理的,材质和纹理是有颜色、质感、光泽等内容的,材质和纹理是GeoModel3D的成分,GeoModel3D是存放在数据集中的,即模型是有自己本身材质和纹理的。

至于风格设置,那是另一个东西,图层风格是设置在图层里面的,是在数据(模型)本身显示内容基础上额外叠加的显示效果,它和模型本身的材质纹理不是一个东西。
明白了,谢谢您,和我之前的思路一样,这块儿还得再仔细理一理。麻烦再请教一下:

取模型骨架里的顶点集Point3d来构建需要的GeoLine3D对象。我看Skeleton类的方法返回类型都是一维数组,是怎么得到Point3D的?具体用哪个方法呢,怎么用?

基于您以上的描述,我建议您是先了解一下超图组件开发里的一些结构概念关系,比如空间信息、属性信息、节点信息是什么,数据集和图层对应关系这些。

可以考虑快速的看一下超图917书院iiObject、Desktop(iDesktop是iobject开发的并且包括绝大部分功能,iDesktop能用明白组件才能开发明白嘛)的免费入门教程。https://edu.supermap.com/#/lessonlist

模型这块,我建议您系统的学习一下三维建模和原理基础下相关的东西(不拘泥于GIS三维)。

之后再来深入理解这种计算机、数据库、三维、gis交叉很深的部分,不然会想您上面说的和理解的一样很混乱,不同的概念和应用情况穿插起来理解错误。

10,513EXP 2022年05月31日
好的,谢谢!还是想问一下,skeleton提取Point3D具体的方法是啥?
skeleton.Vertices获取顶点坐标集(每三个double为一组点的xyz值)
您好!这些顶点的坐标是经过偏移的吗?与真实对象的坐标相差太大了。调试了一下值,没有offset和scale啊
是否应:1、先对模型对象进行投影,转换为平面坐标  2、骨架顶点是相对于模型位置(getPosition方法获取)的相对坐标,应计算得到绝对坐标  3、顶点坐标再转换为地理坐标?
和你上面说的那些都没有关系的哈,模型的位置是模型定位中心坐标决定的。

模型的骨架是自身参考系的,每个模型自身独立的参考系,用这套顶点坐标构建出这个模型是没有地理信息关系的哈,

地理信息要构建出模型后给中心坐标。
所以我提取的这些点还是没有意义啊,不知道模型自身的参考系?请问,怎么把骨架的顶点转换成地理点啊?
对于模型来说,它的每个顶点本来就是不地理坐标的,逻辑是模型根据自己定点坐标之间的相对关系,构建出了模型体之后,再将模型根据模型中心地理坐标挪到正确的位置的。

模型顶点自身的原点是(0,0,0),你直接和你模型定位中心的坐标值偏过去就行。

如果不理解的话,只能去理解下建模模型结构原理和坐标参考系来理解下了。
...