三维场景拾取原理

2024-01-22 03:50
文章标签 原理 场景 三维 拾取

本文主要是介绍三维场景拾取原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拾取原理有以下几种:

  1. 在创建模型的时候,将模型和屏幕像素建立映射关系,当进行拾取时,计算鼠标所在像素位置,再查找映射关系。这种操作偏底层,一般是渲染引擎做的事情,比如OPENGL里的模板测试。
  2. 如果仅使用渲染数据,在视图上,从鼠标位置垂直视图发射一条射线,计算射线和视图对象的位置关系,相交则代表拾取到。
  3. 操作系统处理鼠标事件时,鼠标的坐标位置一般是屏幕坐标(局部坐标),也就是像素值,当使用了三维几何内核时,可以将位置坐标转为世界坐标,也就是真实坐标,从鼠标所在世界坐标位置发出垂直视图的射线,计算和真实模型位置的相对位置关系,如果相交则代表拾取到。
  4. 框选逻辑和单选类似,只不过计算的是长方形和物体的位置关系。由于框选一般是针对多个对象,所以计算量偏大,需要进行简化或者必要的过滤操作,比如将三维投影到二维,对象进行包围盒过滤等。

三维引擎性能问题:

       拾取操作需要确定射线和对象几何的关系,一般是线线求交,线面求交,对于非解析参数几何需要进行大量迭代计算,这种计算本身是比较耗时的,如果模型对象较多,则会存在性能瓶颈。

1. 当模型或者场景视图比较固定,我们可以将三维模型投影到二维,二维模型的位置计算量要远小于三维

2. 当对象较多,而且比较分散,则可以使用树结构,常用的八叉树,kd树,BSP树,R树

3. 包围盒计算效率很高,在实际计算中,可以通过包围盒对对象进行过滤;除了常用的AABB包围盒,有条件可以使用OBB紧包围盒

AABB拾取算法

std::pair<double, double> SlabAABBBase(const AxisAlignedBoundingBox& box) const 
{double t_x0 = x_inv_ * (box.min_bound_.x() - origin().x());double t_x1 = x_inv_ * (box.max_bound_.x() - origin().x());double t_min = std::min(t_x0, t_x1);double t_max = std::max(t_x0, t_x1);double t_y0 = y_inv_ * (box.min_bound_.y() - origin().y());double t_y1 = y_inv_ * (box.max_bound_.y() - origin().y());t_min = std::max(t_min, std::min(t_y0, t_y1));t_max = std::min(t_max, std::max(t_y0, t_y1));double t_z0 = z_inv_ * (box.min_bound_.z() - origin().z());double t_z1 = z_inv_ * (box.max_bound_.z() - origin().z());t_min = std::max(t_min, std::min(t_z0, t_z1));t_max = std::min(t_max, std::max(t_z0, t_z1));return {t_min, t_max};
}

 

这篇关于三维场景拾取原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

99%的人都选错了! 路由器WiFi双频合一还是分开好的专业解析与适用场景探讨

《99%的人都选错了!路由器WiFi双频合一还是分开好的专业解析与适用场景探讨》关于双频路由器的“双频合一”与“分开使用”两种模式,用户往往存在诸多疑问,本文将从多个维度深入探讨这两种模式的优缺点,... 在如今“没有WiFi就等于与世隔绝”的时代,越来越多家庭、办公室都开始配置双频无线路由器。但你有没有注

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字