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();

四、运行效果


相关推荐
Panzer_Jack5 小时前
如何用 WebGL 去实现一个选取色彩背景图片透明化小工具 - Pick Alpha
前端·webgl
烛阴1 天前
Three.js 零基础入门:手把手打造交互式 3D 几何体展示系统
javascript·webgl·three.js
叶智辽2 天前
【ThreeJS调试技巧】那些让 Bug 无所遁形的“脏套路”
webgl·three.js
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
叶智辽3 天前
【ThreeJS急诊室】一个生产事故:我把客户的工厂渲染“透明”了
webgl·three.js
多恩Stone3 天前
【3D-AICG 系列-15】Trellis 2 的 O-voxel Shape: Flexible Dual Grid 代码与论文对应
人工智能·python·算法·3d·aigc
在下胡三汉3 天前
为什么“资产土地”标准化主资产的 glTF、glb格式模型,为什么非常流行
3d
2401_863801463 天前
3DTiles(.b3dm,i3dm,cmpt) 数据转换fbx转obj转max转su,cesium格式模型转换
3d
3Dmax效果图渲染研习社3 天前
2026年3ds Max云渲染平台哪个好?
3d