关于可视域分析的实现

2023-11-02 06:21
文章标签 分析 实现 视域

本文主要是介绍关于可视域分析的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人现在用的Cesium版本是1.61。

功能优化后的完整demo: Cesium功能集 之 034-可视域分析(纯前端)完整版

关于视域分析,Cesium本身是不提供直接接口实现的,也许是我接触的还不够全面,反正自己是没找到现成的东西来调用,没办法只能自己一步一个坑的去踩。前后差不多一天多的时间实现了一个大致的效果,基本可以满足现阶段项目上的需要。效果远达不到那些付费产品视域分析的效果,性能上也会有些许的影响(范围足够大的情况下,性能下降还是比较明显的),现阶段能力也就这样,希望后续能够再完善吧。上图:

思路历程:网上能够搜到的多数都是透视分析的例子,某种情境下,足够多的透视分析结果整合到一起也能看作是一个简单的视域分析。也是顺着这个思路,自己设计了两个思路来实现视域分析:

①利用高程判别:视角初始位置和视域目标点之间组成的一条直线,我们暂且称之为当前视角下的“视域线”,对该直线进行空间插值,获得直线上一系列的空间插值点。对于获取到的每个插值点P(x,y,z)通过getHeight()方法来获取当前场景下(x,y)点的地表高程h,对比z与h的高程关系。若z<h,则证明,该插值点位于地表下,可以归属于不可视域点;反之,若z>h,则归属于可视域点。这样就可以获取到视域线在当前插值精度下的可视域情况。

②pick取交:视角初始位置和视域目标点之间组成的一条射线(方向:视角位置→目标点),我们也称之为“视域线”,通过pickFromRay()方法,可以返回当前视域线与场景(地形或模型等)相交情况result。若result存在,则视角初始位置与result.position之间的区域归属于可视域范围,result.position与目标点之间的区域归属于不可视域范围;若result不存在,即无交点出现,全区域归属于可视域范围。

两种思路,在视角初始位置与目标点之间的方向,连接足够多的视域线,对获取的可视域结果进行整合,得到观察者在该方向(视域)的可视域分析结果;通过调整视角方向获取不同方向的可视域分析结果,最终得出观察者扇形区域的可视域分析结果。

实践过程中,思路①,多视域线计算,重复计算区域过多,没怎么展开就pass掉了;思路②,如上图区域计算结果显然是可用的,但是如果地形复杂,就不再适用。如下图,很显然result交点之前并非都是可视域范围,也存在不可视域。

所以思路②适用于某些场景,接着②的方法,后续改变了思路,在视角初始位置和目标点之间绘制一条假想的贴地的线段polyline,对该polyline进行插值,获取地表点集points。视角初始位置与points中的每一个地表点P形成视域线,通过pickFromRay()获取交点情况,若不存在交点,该地表点P为可视点;若存在交点,该地表点P为不可视点。最终为每个地表点赋值一个可视情况的属性,最后得到一个包含可视域信息的点集。

相同视角下的点集根据可视域属性进行连线,最终形成基本的可视域分析结果。

上代码:

创建视角位置:

构建目标点:

求交,返回结果:

绘制视域分析线:

补充:这种方式虽然可以实现简单的视域分析,在精度要求不高的情况下也基本可以满足需要,但是对性能的损耗比较大,计算也需要花费一定时间,很有继续完善的必要,但是本人确实能力也有限,只能暂时摸索到这。关于后续完善的方法我也大致有一个思路:通过绘制Texture2D图形的形式进行展示,这样对性能来说应该可以提升很多。只是不知可行性如何,自己也没有太多时间,也就只能先这样了。

抱歉之前贴的图片,源代码已经更新在博客:Cesium 可视域分析代码段(源码)补充_总要学点什么的博客-CSDN博客

这篇关于关于可视域分析的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方