cesium 判断模型是否在视锥内

2023-11-29 11:04

本文主要是介绍cesium 判断模型是否在视锥内,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        cesium中每个模型在渲染之前都要进行可见性检测,包括模型是否在地球背面,是否在裁切面中,是否在视锥中。

        下面的代码是在视锥中的可见性判断:

AxisAlignedBoundingBox.intersectPlane = function (box, plane) {//>>includeStart('debug', pragmas.debug);Check.defined("box", box);Check.defined("plane", plane);//>>includeEnd('debug');// 对角线intersectScratch = Cartesian3.subtract(box.maximum,box.minimum,intersectScratch);// 对角线的一半向量const h = Cartesian3.multiplyByScalar(intersectScratch,0.5,intersectScratch); //The positive half diagonal// 面法线const normal = plane.normal;// 点乘const e =h.x * Math.abs(normal.x) +h.y * Math.abs(normal.y) +h.z * Math.abs(normal.z);//const s = Cartesian3.dot(box.center, normal) + plane.distance; //signed distance from center// 完全在内部if (s - e > 0) {return Intersect.INSIDE;}// 完全在外部if (s + e < 0) {//Not in front because normals point inwardreturn Intersect.OUTSIDE;}// 交叉了return Intersect.INTERSECTING;
};

大概过程如下:

        1、视锥分为6个面,每个面使用到原点距离、法线构成。

        2、检测模型包围盒与视锥面的位置关系,在法线的一侧,与视锥面相交,还是与视锥面相交。

其中const s = Cartesian3.dot(box.center, normal) + plane.distance;的计算过程,这个过程分为3中情况:

        1、是box的中心点在法线上的投影,如果投影为正,则在box在法线同侧,s - e > 0

        2、如果投影为负数,则中心点在法线的另一侧,

        3、虽然在另一侧但是box是一个区域,还有交叉的情况存在,所以s + e < 0则box不与视锥面相交,否则就是相交。

这里有一段代码是计算box对角线向量与法线分量都为正的情况,原因是只要中心点在法线的背面,那总会有一个box的顶点与中心点的差向量与裁切面法线方向同向,而这个方向在平面法相法相上的投影值与将他们都挪到原点后的投影值大小相同,故使用绝对值进行计算。

这篇关于cesium 判断模型是否在视锥内的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

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

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

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

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

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll