cesium设置近地天空盒 天空会倾斜

上篇文章讲解了如何设置近地天空盒,效果出来了还是发现天空是斜的

https://blog.csdn.net/m0_63701303/article/details/135618244

效果:

这里需要修改Cesium.skyBox的代码,代码如下直接全部复制组件内调用即可

skybox_nearground.js:


/* eslint-disable */
(function () {const Cesium = window.Cesium;const BoxGeometry = Cesium.BoxGeometry;const Cartesian3 = Cesium.Cartesian3;const defaultValue = Cesium.defaultValue;const defined = Cesium.defined;const destroyObject = Cesium.destroyObject;const DeveloperError = Cesium.DeveloperError;const GeometryPipeline = Cesium.GeometryPipeline;const Matrix3 = Cesium.Matrix3;const Matrix4 = Cesium.Matrix4;const Transforms = Cesium.Transforms;const VertexFormat = Cesium.VertexFormat;const BufferUsage = Cesium.BufferUsage;const CubeMap = Cesium.CubeMap;const DrawCommand = Cesium.DrawCommand;const loadCubeMap = Cesium.loadCubeMap;const RenderState = Cesium.RenderState;const VertexArray = Cesium.VertexArray;const BlendingState = Cesium.BlendingState;const SceneMode = Cesium.SceneMode;const ShaderProgram = Cesium.ShaderProgram;const ShaderSource = Cesium.ShaderSource;//片元着色器,直接从源码复制const SkyBoxFS = `uniform samplerCube u_cubeMap;varying vec3 v_texCoord;void main(){vec4 color = textureCube(u_cubeMap, normalize(v_texCoord));gl_FragColor = vec4(czm_gammaCorrect(color).rgb, czm_morphTime);}`;//顶点着色器有修改,主要是乘了一个旋转矩阵const SkyBoxVS = `attribute vec3 position;varying vec3 v_texCoord;uniform mat3 u_rotateMatrix;void main(){vec3 p = czm_viewRotation * u_rotateMatrix * (czm_temeToPseudoFixed * (czm_entireFrustum.y * position));gl_Position = czm_projection * vec4(p, 1.0);v_texCoord = position.xyz;}`;/*** 为了兼容高版本的Cesium,因为新版cesium中getRotation被移除*/if (!Cesium.defined(Cesium.Matrix4.getRotation)) {Cesium.Matrix4.getRotation = Cesium.Matrix4.getMatrix3}function SkyBoxOnGround(options) {/*** 近景天空盒* @type Object* @default undefined*/this.sources = options.sources;this._sources = undefined;/*** Determines if the sky box will be shown.** @type {Boolean}* @default true*/this.show = defaultValue(options.show, true);this._command = new DrawCommand({modelMatrix: Matrix4.clone(Matrix4.IDENTITY),owner: this});this._cubeMap = undefined;this._attributeLocations = undefined;this._useHdr = undefined;}const skyboxMatrix3 = new Matrix3();SkyBoxOnGround.prototype.update = function (frameState, useHdr) {const that = this;if (!this.show) {return undefined;}if ((frameState.mode !== SceneMode.SCENE3D) &&(frameState.mode !== SceneMode.MORPHING)) {return undefined;}if (!frameState.passes.render) {return undefined;}const context = frameState.context;if (this._sources !== this.sources) {this._sources = this.sources;const sources = this.sources;if ((!defined(sources.positiveX)) ||(!defined(sources.negativeX)) ||(!defined(sources.positiveY)) ||(!defined(sources.negativeY)) ||(!defined(sources.positiveZ)) ||(!defined(sources.negativeZ))) {throw new DeveloperError('this.sources is required and must have positiveX, negativeX, positiveY, negativeY, positiveZ, and negativeZ properties.');}if ((typeof sources.positiveX !== typeof sources.negativeX) ||(typeof sources.positiveX !== typeof sources.positiveY) ||(typeof sources.positiveX !== typeof sources.negativeY) ||(typeof sources.positiveX !== typeof sources.positiveZ) ||(typeof sources.positiveX !== typeof sources.negativeZ)) {throw new DeveloperError('this.sources properties must all be the same type.');}if (typeof sources.positiveX === 'string') {// Given urls for cube-map images. Load them.loadCubeMap(context, this._sources).then(function (cubeMap) {that._cubeMap = that._cubeMap && that._cubeMap.destroy();that._cubeMap = cubeMap;});} else {this._cubeMap = this._cubeMap && this._cubeMap.destroy();this._cubeMap = new CubeMap({context: context,source: sources});}}const command = this._command;command.modelMatrix = Transforms.eastNorthUpToFixedFrame(frameState.camera._positionWC);if (!defined(command.vertexArray)) {command.uniformMap = {u_cubeMap: function () {return that._cubeMap;},u_rotateMatrix: function () {return Matrix4.getRotation(command.modelMatrix, skyboxMatrix3);},};const geometry = BoxGeometry.createGeometry(BoxGeometry.fromDimensions({dimensions: new Cartesian3(2.0, 2.0, 2.0),vertexFormat: VertexFormat.POSITION_ONLY}));const attributeLocations = this._attributeLocations = GeometryPipeline.createAttributeLocations(geometry);command.vertexArray = VertexArray.fromGeometry({context: context,geometry: geometry,attributeLocations: attributeLocations,bufferUsage: BufferUsage._DRAW});command.renderState = RenderState.fromCache({blending: BlendingState.ALPHA_BLEND});}if (!defined(command.shaderProgram) || this._useHdr !== useHdr) {const fs = new ShaderSource({defines: [useHdr ? 'HDR' : ''],sources: [SkyBoxFS]});command.shaderProgram = ShaderProgram.fromCache({context: context,vertexShaderSource: SkyBoxVS,fragmentShaderSource: fs,attributeLocations: this._attributeLocations});this._useHdr = useHdr;}if (!defined(this._cubeMap)) {return undefined;}return command;};SkyBoxOnGround.prototype.isDestroyed = function () {return false};SkyBoxOnGround.prototype.destroy = function () {const command = this._command;command.vertexArray = command.vertexArray && command.vertexArray.destroy();command.shaderProgram = command.shaderProgram && command.shaderProgram.destroy();this._cubeMap = this._cubeMap && this._cubeMap.destroy();return destroyObject(this);}Cesium.GroundSkyBox = SkyBoxOnGround
})();

组件内引入skybox_nearground.js就可使用

注意结尾这是Cesium.GroundSkyBox = SkyBoxOnGround 所以设置天空盒的时候需要从new Cesium.SkyBox()改为new Cesium.GroundSkyBox()

import "./skybox_nearground.js";const wanxiaSkybox = new Cesium.GroundSkyBox({sources: {positiveX: "../../imgs/天空盒2/wanxia/SunSetRight.png",negativeX: "../../imgs/天空盒2/wanxia/SunSetLeft.png",positiveY: "../../imgs/天空盒2/wanxia/SunSetFront.png",negativeY: "../../imgs/天空盒2/wanxia/SunSetBack.png",positiveZ: "../../imgs/天空盒2/wanxia/SunSetUp.png",negativeZ: "../../imgs/天空盒2/wanxia/SunSetDown.png",},
});

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

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

相关文章

分布式光伏运维平台在提高光伏电站发电效率解决方案

摘要:伴随着能源危机和环境恶化问题的日益加重,科技工作者进一步加大对新能源的开发和利用。太阳能光伏发电作为新型清洁能源的主力军,在实际生产生活中得到了广泛的应用。然而,光伏发电效率偏低,成为制约光伏发电发展…

机器学习算法实战案例:LSTM实现单变量滚动风电预测

文章目录 1 数据处理1.1 数据集简介1.2 数据集处理 2 模型训练与预测2.1 模型训练2.2 模型滚动预测2.3 结果可视化 答疑&技术交流机器学习算法实战案例系列 1 数据处理 1.1 数据集简介 实验数据集采用数据集5:风电机组运行数据集,包括风速、风向、…

webpack打包可视化分析工具:webpack-bundle-analyzer

在对webpack项目进行优化的时候,可以使用webpack-bundle-analyzer这个可视化插件来快速分析我们包的结构,能快速定位需要优化的地方,对开发者非常友好 下载安装 下载依赖包 npm i webpack-bundle-analyzer 使用 const BundleAnalyzerPlugin require(webpack-bundle-analy…

qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

系统环境:Win10家庭中文版 Qt : 5.12.9 链接了一些64位的第三方库,程序编译完运行后出现 qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" 弹窗如下: 网上搜了一些都是关于pyQt的&#xff0c…

【实战记录】 vagrant+virtualbox+docker 轻松用虚拟机集成组件

用途 最近要学一大堆组件,不想直接安装本机上,然后gpt说:你可以用vagrant起个虚拟机(然后docker拉取各种组件的镜像);或者k8s 实战的整体思路 首先安装virtualbox和vagrant。然后cmd依次键入三条命令 安…

旧衣回收小程序搭建:降低企业成本,提高回收效率!

在人们环保意识提升下,旧衣回收行业受到了大众的关注,同时旧衣回收具有门槛低、利润大的优势。在我国,回收行业不仅帮助普通人就业获利,还对环保做出了较大贡献。因此,旧衣回收行业成为了当下的热门商业模式&#xff0…

时尚女童冲锋衣外套

上身时尚又好看的外套 日常穿着或者出行游玩 应对早晚温差,兼具时尚和功能 保暖也可以很轻盈 率性闲适的洒脱范 版型百搭好穿 下摆有橡筋收紧更加保暖了 简直就是一件实用与时尚并存的时尚单品

Swift爬虫程序采集招聘信息代码示例

今天我将用Swift写一个爬虫程序,主要是爬取招聘信息网站得。我们知道Selenops是一个简单的Swift Web爬虫工具,可以用于爬取网页内容。您可以使用Selenops的三种方式之一来进行爬虫操作:Swift游乐场、Swift脚本或马拉松脚本SwiftUI是一种用于构…

100个实战项目——在树莓派4B+Ubuntu20.04桌面版配置下运行智能小车(一)

主机SSH远程链接从机 查看python版本 python 我的是python3.8 所以我需要安装pip3 sudo apt install python3-pip 接着安装程序需要的引脚库 sudo pip3 install RPi.GPIO 注意必须要有sudo,因为我是远程遥控的树莓派,没有权限运行程序&#xff0…

如何进行时间管理 待办事项软件帮你成为时间管理大师

在这个快节奏的现代社会,时间显得格外宝贵。每个人都在与时间赛跑,试图在有限的时间里完成更多的事情。我曾经也深陷于这样的困境,每天都被无数的杂事裹挟着,仿佛永远都抓不住时间的尾巴。 那时,我常常感到焦虑和疲惫…

操作系统详解(5.2)——信号(Signal)的题目进阶

系列文章: 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 操作系统详解(5.1)——信号(Signal)的相…

MySQL进阶45讲【1】基础架构:一条SQL查询语句是如何执行的?

1 前言 我们经常说,看一个事儿千万不要直接陷入细节里,应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,有个最简单的…

锐意进取,蓬勃发展|爱基百客2023全景图

岁序更迭,2023年已悄然离去。对我们来说,这是充满挑战与机遇的一年。爱基百客作为一家专注于测序服务的公司,我们在这一年里经历了许多挑战,也取得了令人鼓舞的成绩。前面我们盘点了表观产品和单细胞产品,今天再邀您回…

AI工具推荐:开源TTS(文本生成语音)模型集合

XTTS TTS是一个语音生成模型,可以通过一个简短的6秒音频片段将声音克隆到不同的语言。它不需要大量的训练数据,也不需要耗费大量时间。TTS支持17种语言,可以进行声音克隆、情感和风格转移、跨语言声音克隆以及多语言语音生成等功能。XTTS-v2…

徐州数字孪生元宇宙赋能工业智能制造,助力传统制造业数字化转型

徐州数字孪生元宇宙赋能工业智能制造,助力传统制造业数字化转型。在徐州市制造业企业数字化转型的过程中,数字孪生技术的应用已经取得了显著成效。一方面,企业的生产效率得到了显著提高,产品质量也得到了有效保障。另一方面&#…

LLM:Scaling Laws for Neural Language Models (中)

核心结论 1:LLM模型的性能主要与计算量C,模型参数量N和数据大小D三者相关,而与模型的具体结构 (层数/深度/宽度) 基本无关。三者满足: C ≈ 6ND 2. 为了提升模型性能,模型参数量N和数据大小D需要同步放大,但模型和数…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)

购物车相关 1.添加购物车1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码开发1.2.1 DTO设计1.2.2 Controller层1.2.3 Service层接口1.2.4 Service层实现类1.2.5 Mapper层 2. 查看购物车2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计 2.2 代码开发2.2.…

K8S----YAML

kubernetes中资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON。其内容可以分为如下四个部分: typeMeta:对象类型的元信息,声明对象使用哪个API版本&#xff0c…

L1-027 出租(Java)

下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]2 对应 arr[2]1,index[1]0 对应 arr[0]8,index[2]3 对应 arr[3]0&…

Android Studio安卓读取EM4100 TK4100卡卡号源码

本示例使用的读卡器&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c.w4002-21818769070.35.44005b43nb1q2h&id562957272162 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmln…