SuperMap iClient3D for WebGL之平面场景(三)

在之前的博文中,我们已经向大家介绍了SuperMap iClient3D for WebGL如何加载平面场景。对于球面场景和平面场景,除了在加载的时候需要转换场景模式外,还有以下几个方向与球面场景有差异。

加载实体

球面场景加载实体:

 viewer.entities.add(new Cesium.Entity({
                point: new Cesium.PointGraphics({
                    color: new Cesium.Color(1, 1, 0),
                    pixelSize: 10,
                    outlineColor: new Cesium.Color(0, 1, 1)
                }),
                position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height + 0.5)
            }));

平面场景加载实体:

需要将桌面坐标使用Cesium.SceneTransforms.convert2DToCartesian(scene, position)转换为经过了反投影的坐标p1:

var position1 = new Cesium.Cartesian3(134324234.14989, 54965965.658929, 125);
var p1 = Cesium.SceneTransforms.convert2DToCartesian(scene, position1);

然后再使用反投影后得到的坐标来作为实体的位置从而添加实体(如下)

var position1 = new Cesium.Cartesian3(134324234.14989, 54965965.658929, 125);
var p1 = Cesium.SceneTransforms.convert2DToCartesian(scene, position1);
//在点击位置添加对应点
var entity1 = viewer.entities.add(new Cesium.Entity({
					point: new Cesium.PointGraphics({
							color: new Cesium.Color(1, 1, 0),
							pixelSize: 10,
							// outlineColor: new Cesium.Color(0, 1, 1)
					}),
								position: p1
		}));
viewer.flyTo(entity1)

相机设置

首先我们看下相机设置的接口:

其中有一个参数:convert,这个参数是将目标点从世界坐标转换为场景坐标,默认为true;但是加载球面场景的时候使用的场景坐标,加载平面场景的时候就需要是世界坐标,而本身相机设置的中心点destination这个参数的类型就是世界坐标,因此不需要进行转换,所以在平面场景中设置相机位置时需要设置convert为false;如下两个示例:

球面场景相机设置:

viewer.scene.camera.setView({
        destination : new Cesium.Cartesian3(-1206939.1925299785, 5337998.241228442, 3286279.2424502545),
        orientation : {
            heading : 1.4059101895600987,
            pitch : -0.20917672793046682,
            roll : 2.708944180085382e-13
        }
    });

平面场景相机设置:

viewer.scene.camera.setView({
        destination : new Cesium.Cartesian3(-1206939.1925299785, 5337998.241228442, 3286279.2424502545),
        orientation : {
            heading : 1.4059101895600987,
            pitch : -0.20917672793046682,
            roll : 2.708944180085382e-13
        }
convert:false
    });

点击获取场景坐标实际值

球面场景点击获取场景坐标值:

 var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);

        //设置鼠标左键单击回调事件
        handler.setInputAction(function (e) {
            //首先移除之前添加的点
            viewer.entities.removeAll();
            //获取点击位置笛卡尔坐标
            var position = scene.pickPosition(e.position);

            //将笛卡尔坐标转化为经纬度坐标
            var cartographic = Cesium.Cartographic.fromCartesian(position);
            var longitude = Cesium.Math.toDegrees(cartographic.longitude);
            var latitude = Cesium.Math.toDegrees(cartographic.latitude);
            var height = cartographic.height;
            if (height < 0) {
                height = 0;
            }
            viewer.entities.add(new Cesium.Entity({
                point: new Cesium.PointGraphics({
                    color: new Cesium.Color(1, 1, 0),
                    pixelSize: 10,
                    outlineColor: new Cesium.Color(0, 1, 1)
                }),
                position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height + 0.5)
            }));
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

平面场景点击获取球面场景坐标值:

	var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
						//设置鼠标左键单击回调事件
						handler.setInputAction(function(e) {
							 var position=viewer.scene.pickPositionWorldCoordinates(e.position);
							var position1 = new Cesium.Cartesian3(position.y,position.z,position.x);
							var p1 = Cesium.SceneTransforms.convert2DToCartesian(scene, position1);

							//在点击位置添加对应点
						var entity1 = 	viewer.entities.add(new Cesium.Entity({
								point: new Cesium.PointGraphics({
									color: new Cesium.Color(1, 1, 0),
									pixelSize: 10,
									// outlineColor: new Cesium.Color(0, 1, 1)
								}),
								position: p1
							}));
							viewer.flyTo(entity1)
						}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于你的问题,我可以给出以下建议: 1. 首先,确保你已经获得了 SuperMap iClient3D for WebGL 的许可证,并已经安装在你的系统上。 2. 然后,你需要创建一个基本的 HTML 页面,以便加载 SuperMap iClient3D for WebGL 的 JavaScript 文件。 3. 通过调用 SuperMap 的 JavaScript API,你可以使用 addLayer() 函数将场景加载到你的页面上。你可以使用以下代码示例来加载一个场景: var sceneLayer = new SuperMap.Layer.SceneLayer(); var layerUrl = "http://localhost:8090/iserver/services/3D-WebGL/rest/realspace"; sceneLayer.url = layerUrl; map.addLayer(sceneLayer); 4. 可以使用 setCameraPosition() 函数设置场景的相机位置和方向。你可以使用以下代码示例来设置相机位置和方向: var cameraPosition = new SuperMap.WebRealspace.CameraPosition(); cameraPosition.longitude = -95.34222; cameraPosition.latitude = 29.73972; cameraPosition.altitude = 2500; cameraPosition.heading = 25.0; cameraPosition.tilt = 25.0; cameraPosition.roll = 0.0; realspace.setCameraPosition(cameraPosition); 5. 最后,你可以使用 setCameraLookAt() 函数设置场景的观察位置。你可以使用以下代码示例来设置观察位置: var cameraLookAt = new SuperMap.WebRealspace.CameraLookAt(); cameraLookAt.longitude = -95.34222; cameraLookAt.latitude = 29.73972; cameraLookAt.altitude = 0; realspace.setCameraLookAt(cameraLookAt); 希望以上建议能够帮助你解决问题。如果你有任何其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值