SuperMap iClient3D for WebGL平面场景实现绘制任意面进行GPU空间查询

文章目录


前言

写之前先说一下,以往咱们都是在球面场景中绘制一个规则的体对模型图层做GPU空间查询,可参考:https://www.supermapol.com/webgl/examples/webgl/editor.html#spatialQuery3D。最近遇到有些小伙伴问在平面场景中如何绘制任意面对模型进行GPU空间查询,其实核心就是如何把绘制出来的面拉成一个体并让接口能正确识别这个体,以下是实现方法。


一、加载模型缓存服务并获取需要操作的图层

javascript 复制代码
				//设置平面场景
				scene.mode = SuperMap3D.SceneMode.COLUMBUS_VIEW;
				//加载三维缓存服务
                var promise = scene.open("http://localhost:8090/iserver/services/3D-WorkSpace/rest/realspace");

				//获取需要进行操作的图层
				var layerSelect = [];
                var layer = scene.layers.find("Building_1");
                layer.selectedColor = SuperMap3D.Color.RED;
                layerSelect.push(layer);

二、绘制任意面

这里使用DrawHandler

javascript 复制代码
				//初始化handlerPolygon 
				var handlerPolygon = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon, 0);
				handlerPolygon.drawEvt.addEventListener(function (result) {
                        handlerPolygon.polygon.show = false;
                        handlerPolygon.polyline.show = false;
                     });
                     //激活handlerPolygon
                     handlerPolygon.activate();

三、拉伸体

1、获取步骤二所绘制面的节点

此次在步骤二的addEventListener监听里面获取

javascript 复制代码
						for (var pt of result.object.positions) {
                            var cartographic = SuperMap3D.Cartographic.fromCartesian(pt);
                            var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);
                            var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);
                            var height = cartographic.height;
                            var pnt = new SuperMap3D.Point3D(longitude, latitude, height);

                            point3ds.add(pnt);
                        }
                        point3dsArray.push(point3ds);

2、拉伸体

javascript 复制代码
						//初始化拉伸体
						var geometry = undefined;
                        geometry = new SuperMap3D.GeoRegion3D(point3dsArray);
                        geometry.extrudedHeight = 100; //拉伸高度
                        geometry.isLatLon = false; //设为false
                        geometry.bottomAltitude = 5; //底部高度

3、进行空间查询

javascript 复制代码
						// 空间查询
                        spatialQuery.geometry = geometry;
                        spatialQuery.positionMode = mode;
                        spatialQuery.layers = layerSelect;
                        spatialQuery.outlineColor = SuperMap3D.Color.CORNFLOWERBLUE;
                        spatialQuery.fillStyle = SuperMap3D.FillStyle.Fill_And_WireFrame;
                        spatialQuery.build();

四、运行效果


相关推荐
全栈王校长1 天前
Three.js 材质进阶
webgl·three.js
全栈王校长1 天前
Three.js Geometry进阶
webgl·three.js
学無芷境1 天前
Simulation-Based Segmentation of Blood Vessels in Cerebral 3D OCTA Images
3d
乐园游梦记1 天前
工业视觉(尤其是 3D/2.5D 相机场景)中针对不同数据类型、精度、用途设计的保存格式
数码相机·opencv·3d·c#
REDcker1 天前
3DGS三维高斯泼溅Windows使用指南
3d·模型·三维重建·3dgs·三维模型·高斯泼溅
CG_MAGIC1 天前
效果图渲染小诀窍
3d·效果图·建模教程·渲云
大鹅同志1 天前
Ubuntu 20.04使用MB-System分析与可视化EM3000数据
数据库·3d·ros·slam·mb-system
烛阴2 天前
3D字体TextGeometry
前端·webgl·three.js
CG_MAGIC2 天前
效果图云渲染平台如何选择?
3d·3dmax·建模教程·渲云渲染·渲云
安生爱学习❤2 天前
(CVPR 2025) Birth and Death of a Rose 不靠 3D 数据,从 2D 扩散模型生成 4D 对象
3d