翔翔
什么叫点外挂模型?顾名思义,三维点与外部模型文件进行关联。那么是如何关联的呢?三维点数据中可以存在很多属性,其中有一个字段存储的是模型文件的绝对路径,还有一个字段存储的是模型旋转缩放平移的矩阵,这样就将三维点和外部模型关联上了。
在超图的三维平台中,模型数据都要生成缓存,这样是为了在场景中提升性能。iDesktop 10i中可以已经集成该功能,在桌面的右上角搜索“点集生成缓存外挂模型”就能找到该功能的具体地方从而进行操作。但是本文主要说的是iObjects .NET组件中是如何实现点外挂模型生成缓存的。
在iObjects .NET中,用到的类是Point3DLinkModelCacheBuilder。使用方法如下代码:
public static void Point3DLinkModelToCache()
{
Workspace m_workspace = new Workspace();
DatasourceConnectionInfo info = new DatasourceConnectionInfo(@"E:\1、工作\Code\Point3DAndModelToCache\Data\Point3D.udbx", "Point3D", "");
info.EngineType = EngineType.UDBX;
Datasource m_datasource = m_workspace.Datasources.Open(info);
DatasetVector m_datasetVector = m_datasource.Datasets["Position"] as DatasetVector;
//三维点外挂模型生成缓存
Point3DLinkModelCacheBuilder m_Point3DLinkModelCacheBuilder = new Point3DLinkModelCacheBuilder();
List<DatasetSetting> datasets = new List<DatasetSetting>();
DatasetSetting ds = new DatasetSetting();
ds.Dataset = m_datasetVector;
ds.UserIDField = "SmID";
datasets.Add(ds);
//m_Point3DLinkModelCacheBuilder.Dataset = m_datasetVector; //点数据集
m_Point3DLinkModelCacheBuilder.DatasetSettingArray = datasets;//批量点数据集生成缓存外挂模型
m_Point3DLinkModelCacheBuilder.Bounds = m_datasetVector.Bounds; //缓存范围大小
m_Point3DLinkModelCacheBuilder.LODSize = 4; //LOD层级数
m_Point3DLinkModelCacheBuilder.ObjectFiltrateThreshold = 2; //过滤阈值
m_Point3DLinkModelCacheBuilder.ModelFilePathField = "ModelPath"; //模型文件路劲,给定字段名
m_Point3DLinkModelCacheBuilder.ProcessThreadsCount = 4; //线程数
m_Point3DLinkModelCacheBuilder.TileWidth = 600; //瓦片边长,单位:米
///设置矩阵
m_Point3DLinkModelCacheBuilder.MatrixField = "Matrix";
m_Point3DLinkModelCacheBuilder.FileType = CacheFileType.S3MB; //缓存文件类型,建议生成S3MB;
m_Point3DLinkModelCacheBuilder.CacheName = "Point3D"; //缓存名称
m_Point3DLinkModelCacheBuilder.OutputFolder = @"E:\1、工作\Code\Point3DAndModelToCache\Data"; //缓存输出路径
m_Point3DLinkModelCacheBuilder.Build(); //执行生成缓存
Console.WriteLine("缓存成功");
Console.ReadLine();
}
下面详细解析上诉代码。
Dataset:如果单个数据集生成一个scp配置文件,那么就设置该属性。
DatasetSettingArray:批量点数据集生成缓存,是将多个点数据集添加到List,最后生成一个scp配置文件,也就是将多个图层合并成一个图层。
Bounds:缓存的范围,也就是数据集的范围。
LODSize:LOD层级,按照层级对模型进行简化。
ObjectFiltrateThreshold:过滤阈值,当模型显示的像素值小于该值时,模型对象将会被隐藏,有效提升性能。
ModelFilePathField: 模型文件路径字段,一个文本型字段,里面存储的是模型的全路径,模型文件格式建议用s3m或者s3mb格式。
ProcessThreadsCount:生成缓存时使用的线程数,线程数设置的越多,生成速度越快。
TileWidth:瓦片边长,根据数据来确定瓦片边长范围,范围不能太大也不能太小,当太大了之后一块上的模型久越多,此时加载性能会较差。当太小了之后,tiles文件夹越多,加载性能也会较差。此值需要根据当前使用数据来尝试。
MatrixField: 矩阵字段,每个值以#隔开。主要表示当前模型的旋转、缩放和平移的效果。如果模型没有旋转、缩放和平移,那么就按照默认的矩阵设置。默认矩阵:1#0#0#0#0#1#0#0#0#0#1#0#0#0#0#1 。如果需要自己计算矩阵可以参考组件帮助文档中的Matrix类。
FileType:缓存文件类型,支持S3MB、S3M、OSGB等,但是建议使用S3MB。
CacheName:缓存文件名字。
OutputFolder:缓存输出路径。
Build():开始生成缓存。
通过以上代码生成的缓存效果如下图:
!