SuperMap iClient3D for Cesium绘制河流(二)

2024-01-03 17:28

本文主要是介绍SuperMap iClient3D for Cesium绘制河流(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:kele

前言
之前分享过一篇《SuperMap iClient3D for WebGL绘制河流》(跳转)的文章,当时的思路是以 entity 中的 polyline 作为载体,给它添加流动材质来表达出河流效果,但是由于 polyline 对象是像素宽度,线宽始终是相对屏幕的固定大小,导致在场景放大缩小过程中,河流宽度与周围的山脉位置和大小不匹配,这个问题困扰了小编好久。最近想到了一个新的方案,并且能够支持实时更改河流宽度和高度,一起来看下如何实现吧~

一、解决思路

为了解决这个问题,先后考虑过以下几种方案:

  • corridor 走廊对象:
    大小正常,但水流方向为统一方向,不是沿线流动方向
    在这里插入图片描述
  • polygon 面对象:
    大小正常,但水流方向为统一方向,不是沿线流动,适合用来表达湖泊效果
  • wall 墙对象:
    大小正常,水流方向沿墙体方向流动,但是墙体为向上拉伸只能竖着,河流表面应该是水平面,所以无法表达河流效果在这里插入图片描述
  • polylineVolume 多段线柱体对象:
    多段线柱体对象类似于截面放样功能,通常是用来表达管道和墙体,我们先制作一个圆管看看效果
    在这里插入图片描述
    如上所示,河流大小正常,水流方向为沿线方向,这两方面都是符合预期的。接下来我们可以将管道截面改为一条横线,最终得到结果就是一个面片,感觉这个方式可行

二、实现代码

2.1 绘制河流

经过上面的分析,我们最终选择使用 polylineVolume 多段线柱体对象绘制河流,这个方案的关键所在就是需要一个合适的截面:

river = viewer.entities.add({name : 'river',polylineVolume : {positions: new Cesium.Cartesian3.fromDegreesArrayHeights(positions),  //节点坐标shape: computeCircle(150.0),  //截面形状material : new Cesium.PolylineTrailLinkMaterialProperty(Cesium.Color.SKYBLUE,10000),cornerType: Cesium.CornerType.MITERED,}
})function computeCircle(radius) {  //设置截面长和宽的大小var positions = [];for(var i = 0; i < 180; i++) {let x = radius * Math.cos(Math.PI * 2 * i / 360); //宽度参数radius可传入进行控制let y = 0.1 * Math.sin(Math.PI * 2 * i / 360); //将高度尽可能设置小,达到面片效果positions.push(new Cesium.Cartesian2(x, y));}return positions;
}

将截面设置为面片模拟河流
在这里插入图片描述

2.2 调整河流宽度

因为我们使用的是 polylineVolume 多段线柱体对象,他没有 width 属性,而是通过改变截面大小,来实现河流宽度的修改,配合着 CallbackProperty 属性,我们就可以实时改变河流宽度了。

shape: new Cesium.CallbackProperty(setWidth,false),
function setWidth() {var positions = [];for(var i = 0; i < 180; i++) {let x = roverWidth * Math.cos(Math.PI * 2 * i / 360);let y = 0.1 * Math.sin(Math.PI * 2 * i / 360);positions.push(new Cesium.Cartesian2(x, y));}return positions;
}
$('#addwidth').click(function () {roverWidth += 20
});
$('#reducewidth').click(function () {roverWidth -= 20
});

2.3 调整河流高度

同样的,polylineVolume 多段线柱体对象没有高度属性,想要改变数据的高度,需要改变传入坐标的 z 值,同样需要使用 CallbackProperty 属性来实现

positions: new Cesium.CallbackProperty(setHeight,false),
function setHeight() {return new Cesium.Cartesian3.fromDegreesArrayHeights(positions)
}
$('#addheight').click(function () {for(let i=0;i<positions.length/3;i++){positions[i*3+2] += 20;}
});
$('#reduceheight').click(function () {for(let i=0;i<positions.length/3;i++){positions[i*3+2] -= 20;}
});

三、最终效果

在这里插入图片描述
demo地址:
链接:https://pan.baidu.com/s/1e8zxMY31GUVFwmQAyx7BqA
提取码:6655

这篇关于SuperMap iClient3D for Cesium绘制河流(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566500

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

SuperMap iManger 单个镜像更新流程

1. 下载镜像 docker pull registry.cn-beijing.aliyuncs.com/supermap/common-dashboard-api:11.1.1-240802-amd64 label 没区分架构,在 x64 环境 pull arm64 镜像 通过 --platform=arm64 参数可以实现 docker pull mariadb:10.5.26

我成功在本地打开了Cesium啦!

1首先下载Node.js,我是跟着这篇下载的,https://zhuanlan.zhihu.com/p/77594251,不过这后面的我没弄对Cesium环境配置也没影响。 另外:我看其他推文说,在终端写node -v和npm-v查node和npm的版本可以检测node和npm是否下载成功。 2然后我在CesiumB站官号看的教学视频,跟着下载Cesium源代码。 Cesium基础入门1-零

使用matplotlib绘制散点图、柱状图和饼状图-学习篇

一、散点图 Python代码如下: num_points = 100x = np.random.rand(num_points) #x点位随机y = np.random.rand(num_points) #y点位随机colors = np.random.rand(num_points) #颜色随机sizes = 1000 * np.random.rand(num_points) # 大

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

Kubernetes 1.25 containerd 环境部署 SuperMap iManager

超图官网目提供的Kubernetes 版本为 1.20 版本,容器运行时为 docker 本次部署使用已有的 Kubernetes 1.25 版本集群,容器运行时为 containerd Kubernetes ,containerd 部署请自行了解,本次不做介绍,下面介绍在此环境上如何部署 iManager 11i 并创建云套件 1. 环境介绍 虚拟机 CPU 内存 操作系统 Ku