Direct3D拾取
- Direct3D拾取 推荐度:
- 相关推荐
Direct3D拾取
假设在屏幕上单击,击中的位置为点s=(x,y)。由图可以看出,用户选中了茶壶。但是仅给出点s,应用程序还无法立即判断出茶壶是否被选中。所以针对这类问题,我们需要采用一项称为“拾
取(Picking)”的技术。
茶壶和屏幕点s之间的一种联系是茶壶被投影到了一个包含了s的区域中。更准确地说,茶壶被投影到了投影窗口中一个包含点p(点P位于投影窗口中)的区域中,其中点P对应于屏幕中的点s。
我们看到,如果自坐标原点发出一条拾取射线(picking ray)该射线将与那些其投影包围了点p的物体(即茶壶)相交。所以,一旦计算出了拾取射线,我们就可对场景中的每个物体进行遍历,并逐个测试射线是否与其相交,与射线相交的物体即为用户所拾取的物体。如果拾取射线不与场景中的任意物体相交,则用户便没有拾取到任何物体,而是选中了屏幕中的背景或些我们并不感兴趣的东西。
拾取原理步骤
- 给定所单击的屏幕点s,求出它在投影窗口中的对应点P。
- 计算拾取射线。即自坐标原点发出且通过点P的那条射线。
- 将拾取射线和物体模型变换至同一坐标系中。
- 进行物体/射线的相交判断。相交的物体即为用户所拾取的屏幕对象。
屏幕到投影窗口的变换
视口变换的矩阵为
(里面的参数为D3DVIEWPORT9中的参数)
对投影窗口中的点实施视口变换(将p放入1x4矩阵后与视口变换矩阵相乘),就得到了屏幕点。
,
视口变换之后z坐标并不作为2D图像的一部分进行存储,而是被保存在深度缓存中。解上面的方程后得到,
最新文章
- 浪潮服务器安装操作系统
- 2012年08月16日 Go生态洞察:优雅的代码组织之道
- 打造全身视角的医院可视化能源监测管理平台,实现医院能源可视化管理
- 深入解析Nacos:服务发现、配置管理与更多特性解析
- 如何使用 Java 设计一个简单的成绩计算程序
- 深度学习:多模态与跨模态
- MySQL为什么Spring的jdbcTemplate.batchUpdate()这么慢?
- 数据仓库入门简介
- 3D模型人物换装系统二(优化材质球合批降低DrawCall)
- XML Web 服务 Eclipse实现中的sun
- 通过Python设置及读取PDF属性,轻松管理PDF文档
- 开源供应链管理系统 多供应商批发管理系统方案及源码输出
- 智能化的同城服务共享台球室小程序系统,提升台球室运营效率
- STM32常见符号解释定义(持续更新)
- 提升SDK广告填充率的有效方法
- Wpf 使用 Prism 实战开发Day05
- GoldWave 6.78中文免费激活版功能特色2024最新功能解析