cesium学习记录06-视图、场景与相机

news2024/10/7 18:22:46

一、视图(Viewer)

viewer是cesium的核心类,是一切的开端。通过new Cesium.Viewer(container, options)来创建一个Viewer对象,而通过这个 Viewer对象,可以添加图层、实体、相机控制等,以及设置一些全局属性。在日常Cesium开发中,几乎都是围绕着这个对象展开的。

创建Viewer实例
let viewer = new Cesium.Viewer(container, options);

container:必需,表示视图器容器元素的ID字符串或HTML元素。
options:可选,用于定制Viewer对象。有许多选项可以配置。更多选项请查看

示例代码:
// 实例化地球
    let viewerOption = {
      geocoder: false, // 地名查找,默认true
      homeButton: false, // 主页按钮,默认true
      sceneModePicker: false, //二三维切换按钮
      baseLayerPicker: false, // 地图切换控件(底图以及地形图)是否显示,默认显示true
      navigationHelpButton: false, // 问号图标,导航帮助按钮,显示默认的地图控制帮助
      // animation: false, // 动画控制,默认true .
      shouldAnimate: true, // 是否显示动画控制,默认true .
      shadows: true, // 阴影
      timeline: true, // 时间轴,默认true .
      CreditsDisplay: false, // 展示数据版权属性
      fullscreenButton: false, // 全屏按钮,默认显示true
      infoBox: true, // 点击要素之后显示的信息,默认true
      selectionIndicator: true, // 选中元素显示,默认true
      contextOptions: {
        webgl: {
          preserveDrawingBuffer: true //cesium状态下允许canvas转图片convertToImage
        }
      }
    };
  let viewer = new Cesium.Viewer("cesiumContainer", viewerOption);

在这里插入图片描述

主要方法(更多内容请查看):

destroy(): 销毁viewer。
extend(): 扩展viewer。
resize(): 调整viewer的大小。
zoomTo(): 缩放视图以查看给定的对象。
flyTo(): 飞向一个对象。
forceResize(): 强制重新调整viewer的大小。

例如:

 viewer.destroy();      //销毁viewer

二、场景 (Scene)

通过Scene对象可以在视图下添加图形(primitive)、添加场景特效(如后处理特效postProcessStage)、添加场景事件或控制视图下的星空skyBox、大气层skyAtmosphere、地球globe、太阳sun和月亮moon。

示例代码:

添加场景特效之雪天效果

viewer.scene.postProcessStages.add(this.snowStage);
/**
   * 雪天效果
   */
  SnowEffect() {
    var viewer = this.viewer;
    let option = {
      snowSize: 0.01, // 雪花大小,值越大雪花越大 最好不要超过0.01
      snowSpeed: 60 // 雪花速度,值越大雪花越慢
    };
    this.snowStage = new Cesium.PostProcessStage({
      name: "czm_snow",
      fragmentShader: this.Snow(),
      uniforms: {
        snowSize: () => {
          return option.snowSize;
        },
        snowSpeed: () => {
          return option.snowSpeed;
        }
      }
    });
    viewer.scene.postProcessStages.add(this.snowStage);
  },
  /**
   * 雪天效果着色器
   * @returns {string} 着色器
   */
  Snow() {
    return "uniform sampler2D colorTexture;\n\
    varying vec2 v_textureCoordinates;\n\
    \n\
    uniform float snowSpeed;\n\
    uniform float snowSize;\n\
    float snow(vec2 uv,float scale){\n\
        float time = czm_frameNumber / snowSpeed;\n\
        float w=smoothstep(1.,0.,-uv.y*(scale/10.));\n\
        if(w<.1)return 0.;\n\
        uv+=time/scale;\n\
        uv.y+=time*2./scale;\n\
        uv.x+=sin(uv.y+time*.5)/scale;\n\
        uv*=scale;\n\
        vec2 s=floor(uv),f=fract(uv),p;\n\
        float k=3.,d;\n\
        p=.5+.35*sin(11.*fract(sin((s+p+scale)*mat2(7,3,6,5))*5.))-f;\n\
        d=length(p);\n\
        k=min(d,k);\n\
        k=smoothstep(0.,k,sin(f.x+f.y)*snowSize);\n\
        return k*w;\n\
    }\n\
    \n\
    void main(){\n\
        vec2 resolution = czm_viewport.zw;\n\
        vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);\n\
        vec3 finalColor=vec3(0);\n\
        float c = 0.0;\n\
        c+=snow(uv,30.)*.0;\n\
        c+=snow(uv,20.)*.0;\n\
        c+=snow(uv,15.)*.0;\n\
        c+=snow(uv,10.);\n\
        c+=snow(uv,8.);\n\
        c+=snow(uv,6.);\n\
        c+=snow(uv,5.);\n\
        finalColor=(vec3(c));\n\
        gl_FragColor = mix(texture2D(colorTexture, v_textureCoordinates), vec4(finalColor,1), 0.3);\n\
        \n\
    }\n\
    ";
  },

在这里插入图片描述

三、相机(Camera)

Camera表示观察场景的视角。通过操作摄像机,可以控制视图的位置、方向和角度。
更多请查看

示例代码:
 //设置相机位置
    viewer.camera.setView({
      // 定义相机的目标位置(笛卡尔坐标)
      destination: {
        x: -2349785.4381783823,
        y: 4596905.031779513,
        z: 3743318.751622788
      },
      // 定义相机的方向和角度
      orientation: {
        // 相机的偏转角度(heading表示从正北开始逆时针旋转的角度。其数值是以弧度表示的。一个值为0的heading通常表示正北)
        // 偏航角(飞机向左飞还是向右飞)
        heading: 0.1015029573852555,
        // 相机的上下倾斜角度(一个负的pitch值表示相机是向下倾斜的。)
        // 俯仰角(飞机向上抬头或是向下低头)
        pitch: -0.3482370478292893,
        // 相机围绕其查看方向(或称前进方向)的旋转角度(当roll值为π/2或90°(转换为弧度)时,相机将绕其前进方向旋转90度。这意味着相机的“顶部”现在指向其右侧。)
        // 翻滚角(飞机沿前进方向轴顺时针翻转为正角度)
        roll: 0.00005029594533212389
      }
    });

Cesium中的orientation属性用于设定各种对象的方向,不仅仅是相机的方向,还包括其他实体如模型的方向。下面以飞机模型为例,当设定飞机模型的orientation,实际上是在定义飞机的朝向和姿态。想象自己在驾驶这架飞机,那么飞机的前进方向和你的视线方向在概念上是相似的,那么你的眼就相当于相机 。
飞机水平飞行:
在这里插入图片描述
飞机向左偏:
在这里插入图片描述
飞机抬头:
在这里插入图片描述
飞机顺时针旋转:
在这里插入图片描述

相机操作:

1,飞行(fly): 使相机飞向某个指定的位置。这通常是一个平滑的过渡,不仅仅是简单的位置变换。

    viewer.camera.flyTo({
      destination: Cesium.Cartesian3.fromDegrees(
        lon,
        lat,
        height
      ),
      duration: duration //持续时间
    });

2,缩放(zoom): 使相机向前或向后移动,从而使视野放大或缩小。

// 缩小
viewer.camera.zoomOut(500); // 向后移动500米
// 放大
viewer.camera.zoomIn(500);  // 向前移动500米

3,移动(move): 沿着地平面或其他方向移动相机,而不改变它的高度或朝向。

// 向右移动
viewer.camera.moveRight(500);  // 地面上向右移动500米

4,视角(look): 改变相机的朝向,但不改变其位置。通常用于围绕某个点旋转。

viewer.camera.look(Cesium.Cartesian3.UNIT_Z, Cesium.Math.toRadians(-10));  // 向下看10度

5,平面扭转(twist): 改变相机的roll值,使相机绕其前进方向轴旋转。

viewer.camera.twistRight(Cesium.Math.toRadians(10));  // 顺时针扭转10度

6,3D旋转(rotate): 在三维空间中旋转相机,可以是任意方向的旋转。

viewer.camera.rotate(Cesium.Cartesian3.UNIT_Z, Cesium.Math.toRadians(10));  // 绕Z轴旋转10度

7,用于将相机视角锁定到目标位置(lookAt): 设置相机的位置和朝向,以使其始终面向某个特定的点或对象。

var targetPosition = Cesium.Cartesian3.fromDegrees(103.851959, 1.290270);
viewer.camera.lookAt(targetPosition, new Cesium.HeadingPitchRange(0, -Cesium.Math.PI_OVER_FOUR, 1500.0));

8,将地球或场景缩放到该实体的视图范围内(viewer.zoomTo()): 调整相机的位置和朝向,以最佳地查看某个特定的实体或对象

var entity = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(103.851959, 1.290270),
    box: {
        dimensions: new Cesium.Cartesian3(400000.0, 300000.0, 500000.0),
        material: Cesium.Color.RED.withAlpha(0.5),
        outline: true,
        outlineColor: Cesium.Color.RED
    }
});
viewer.zoomTo(entity);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/859349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Whisper.cpp 编译使用

Whisper.cpp 编译使用 whisper.cpp 是牛人 ggerganov 对 openai 的 whisper 语音识别模型用 C 重新实现的项目&#xff0c;开源在 github 上&#xff0c;具有轻量、性能高&#xff0c;实用性强等特点。这篇文章主要记录在 windows 平台&#xff0c;如何使用该模型在本地端进行…

自学网络安全(黑客)全网详细路线

前言 web渗透是网络安全大行业里入门板块&#xff0c;就像十年前的软件&#xff0c;前景非常被看好&#xff0c;薪资也很诱人。与软件测试和前端开发只需掌握一定的编程能力不同的是&#xff0c;渗透需要掌握的知识内容较多&#xff0c;花费的时间较长&#xff0c;渗透测试掌握…

网络:CISCO、Huawei、H3C命令对照

思科、华为、锐捷命令对照表 编号思科华为锐捷命令解释1 2writesavesave保存3456 如果你所处的视图为非系统视图&#xff0c;需要查看配置的时候&#xff0c;需要在该配置命令前加do。 在特定的视图之下&#xff0c;有对应的特定命令。例如&#xff0c;在接口视图下的ip addre…

数组常用方法总结

数组常用方法总结 一.获取数组长度1.1 使用length 二.数组转字符串2.1 Arrays是什么2.2 使用toString() 三. 数组拷贝3.1 使用 copyOf()3.2 copyOfRange() 四.数组排序4.1使用 sort() 五. 数组逆序六. 判断两个数组是否相等6.1 使用equals() 一.获取数组长度 1.1 使用length p…

YAMLException: java.nio.charset.MalformedInputException: Input length = 1

springboot项目启动的时候提示这个错误&#xff1a;YAMLException: java.nio.charset.MalformedInputException: Input length 1 根据异常信息提示&#xff0c;是YAML文件有问题。 原因是yml配置文件的编码有问题。 需要修改项目的编码格式&#xff0c;一般统一为UTF-8。 或…

pdf怎么转换成jpg图片?这几个转换方法了解一下

pdf怎么转换成jpg图片&#xff1f;转换PDF文件为JPG图片格式在现代工作中是非常常见的需求&#xff0c;比如将PDF文件中的图表、表格或者图片转换为JPG格式后使用在PPT演示、网页设计等场景中。 【迅捷PDF转换器】是一款非常实用的工具&#xff0c;可以将PDF文件转换成多种不同…

Java 中如何优雅的实现对外接口,需要注意哪些事项?

博主之前做过恒丰银行代收付系统&#xff08;相当于支付接口&#xff09;&#xff0c;包括现在的oltpapi交易接口和虚拟业务的对外提供数据接口。总之&#xff0c;当你做了很多项目写了很多代码的时候&#xff0c;就需要回过头来&#xff0c;多总结总结&#xff0c;这样你会看到…

react中使用路由起手式,一些思路和细节。

一.安装并配置 我们选择使用react-router实现路由效果 yarn add react-router-dom下载后需要对Route进行引入&#xff0c;是个内置的组件。该组件是有两个属性一个是path&#xff0c;一个是component&#xff0c;path是组件对应的路由&#xff0c;component是对应的组件 二.…

pytest 用例运行方式

一、命令行方式运行 执行某个目录下所有的用例&#xff0c;符合规范的所有用例 进入到对应的目录,直接执行pytest; 例如需要执行testcases 下的所有用例; 可以进入testcases 目录; 然后执行pytest 进入对应目录的上级目录,执行pytest 目录名称/ ; ; 例如需要执行testcases 下…

kafka 分布式的情况下,如何保证消息的顺序消费?

目录 一、什么是分布式 二、kafka介绍 三、消息的顺序消费 四、如何保证消息的顺序消费 一、什么是分布式 分布式是指将计算任务分散到多个计算节点上进行并行处理的一种计算模型。在分布式系统中&#xff0c;多台计算机通过网络互联&#xff0c;共同协作完成任务。每个计…

LinearAlgebraMIT_8_TheRankOfMatrix

这节课中主要讲解根据秩来判断方程组/矩阵的(solvability)解情况&#xff0c;即通过秩来判断(aumented matrix)增广矩阵的解。我们需要直接求解方程组的解就是求解矩阵的解。 x.1 判断(非齐次线性方程组)Axb是否有解 我们以下面这个方程组为例&#xff0c;它具有3个约束条件和…

innodb buffer pool

buffer pool是主存中的一个区域&#xff0c;InnoDB 在访问时缓存表和索引数据。缓冲池允许直接从内存访问频繁使用的数据&#xff0c;这加快了处理速度。在专用服务器上&#xff0c;高达80% 的物理内存通常分配给缓冲池。为了提高大容量读取操作的效率&#xff0c;将缓冲池划分…

fetch异步上传图片(附html+JavaScript+php代码)

效果 index.html <!DOCTYPE html> <html><head><title>图片上传示例</title><meta charset"utf-8"><script src"upload.js"></script><style>*{padding: 0;margin: 0;}#app{width: 500px;margin: …

什么是媒体代发布?媒体代发布注意事项

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体代发布是指将新闻稿或其他宣传内容委托给专业的媒体代理机构或公司进行发布和推广的活动。这些机构通常拥有丰富的媒体资源、人脉和经验&#xff0c;能够更好地将信息传递给目标受众…

MySQL5.7保姆级安装教程

环境 Linux版本Mysql版本(待安装)CentOS 75.7 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包&#xff1a;http://dev.mysql.com/downloads/repo/yum/ 目前MySQL官网下载的MySQL源安装后yum下载的MySQL是8.0版本&#xff0c;为了非必要的麻烦&#xff0c;直接提供MySQL5.7的…

MNIST数据集知识合集

MNIST数据集知识合集 认识MNIST数据集通过本地文件加载MNIST数据集torchvision.datasets加载MNIST数据集可视化&#xff08;即转换成.jpg/.png之类的文件&#xff09;疑惑—datasets.mnist和datasets.MNIST问题—downloadFalse运行报错 搭建CNN用于数字识别 认识MNIST数据集 M…

MODBUS TCP转CCLINK IE协议网关cclink通讯异常的处理方法

你是否曾经遇到过需要将不同的设备连接到一个统一的网络中&#xff1f;或者你是否曾经遇到过设备之间的通讯协议不兼容的问题&#xff1f;捷米的JM-CCLKIE-TCP通讯网关就是为解决这些问题而设计的。 JM-CCLKIE-TCP通讯网关是一款自主研发的CCLINK IE FIELD BASIC从站功能的通讯…

Appium2 安装教程

目录 第一步&#xff1a;安装 node.js 第二步&#xff1a;安装 Android Studio 第三步&#xff1a;下载 JDK 第四步&#xff1a;安装 Appium 卸载旧版本appium1.X 安装新版Appium2.0 安装appium驱动与插件 第五步&#xff1a;安装appium inspector 第六步&#xff1a;…

VSCode-Python传参数进行Debug

新建demo.py import argparse def parse_args():description "debug example" parser argparse.ArgumentParser(descriptiondescription) help "The path of address"parser.add_argument(--host,help help) parser.add_ar…

2023-08-05力扣今日五题-好题

链接&#xff1a; 剑指 Offer 52. 两个链表的第一个公共节点 题意&#xff1a; 如题 解&#xff1a; 非常有趣的双指针 首先我们不管他们是否有公共段啊&#xff0c;我们要知道一个指针从A出发走到A结尾&#xff0c;再从B出发走到B结尾&#xff0c;和从B出发最终到A结尾是…