Cesium插件系列——3dtiles压平

2024-03-01 19:20

本文主要是介绍Cesium插件系列——3dtiles压平,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本系列为自己基于cesium写的一套插件具体实现。

这里是根据Cesium提供的CustomShader来实现的。
在这里插入图片描述

在CustomShader的vertexShaderText里,需要定义vertexMain函数,例如下:

struct VertexInput {Attributes attributes;FeatureIds featureIds;Metadata metadata;MetadataClass metadataClass;MetadataStatistics metadataStatistics;
};
struct czm_modelVertexOutput {vec3 positionMC;float pointSize;
};
void vertexMain(VertexInput vsInput, inout czm_modelVertexOutput vsOutput) {}

我们可以从vsInput中获得该顶点的模型局部坐标。如果我们要实现压平,最好是在ENU坐标下来进行修改顶点坐标的高度。所以我们要实现的逻辑就是:将顶点坐标转成ENU坐标 -----> 判断是否在多边形范围内 -----> 若是则修改高度 -----> 转回模型坐标。

将顶点坐标转成ENU坐标:

// 计算u_tileset_worldToLocalMatrix
const origin = tileset.boundingSphere.center;
const matrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin);
u_tileset_worldToLocalMatrix = Cesium.Matrix4.inverse(matrix, new Cesium.Matrix4())vec3 modelMC = vsInput.attributes.positionMC;
vec4 tileset_local_position = u_tileset_worldToLocalMatrix * czm_model * vec4(modelMC, 1.0);

判断是否在多边形范围内:
我们转成ENU坐标后,其实可以在EN平面上去进行判断。将多边形的经纬度点都转成ENU坐标,只取xy值,然后跟该顶点进行平面判断。

转回模型坐标:

if(isPointInPolygon(position2D)) {vec4 tileset_local_position_transformed = vec4(tileset_local_position.x, tileset_local_position.y, ground_z, 1.0);vec4 model_local_position_transformed = czm_inverseModel * u_tileset_localToWorldMatrix * tileset_local_position_transformed;vsOutput.positionMC.xy = model_local_position_transformed.xy;vsOutput.positionMC.z = model_local_position_transformed.z + modelMC.z*0.002;return;
}

最后再将customShader赋给3dtiles对象即可。

palaceTileset.customShader = flatCustomShader;

这篇关于Cesium插件系列——3dtiles压平的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(