三维场景拾取原理

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

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.