关于可视域分析的实现

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

相关文章

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

Go 1.23中Timer无buffer的实现方式详解

《Go1.23中Timer无buffer的实现方式详解》在Go1.23中,Timer的实现通常是通过time包提供的time.Timer类型来实现的,本文主要介绍了Go1.23中Timer无buff... 目录Timer 的基本实现无缓冲区的实现自定义无缓冲 Timer 实现更复杂的 Timer 实现总结在

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的