D3D11 拾取

在D3D11中,由于缺少D3D10中的网格接口,物体拾取操作需要自行实现。文章介绍了如何进行拾取操作,包括通过计算射线与物体的交点,利用三角形区域判断点是否在内,以及更新后的LoadObjModel函数和效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章节是基于法线贴图章节的。

这里将介绍如何将2d屏幕位置(以像素为单位,鼠标所在的位置)转换为世界空间中的3d射线,随后检测该射线是否会和屏幕上的其他物体相交。(本例中假设物体是瓶子)。
若射线和瓶子相交,就会显示出相机到瓶子的距离,并增加分数,且删除瓶子,不让它再次显示以避免射线与它再次相交检测。

D3D11中的拾取操作比D3D10要多一个步骤,因为在D3D11中没有网格接口,之前的网格接口是有一个方法可用于检测射线是否和一个物体相交的。因此,现在就需要自己实现这个功能。


拾取3D物体
要拾取一个3D物体,需要遵循以下步骤:
a.获取屏幕空间鼠标位置的2D向量(x,y)值。
b.将屏幕空间鼠标的2D向量转换为视图空间射线的3D向量(x,y,z)。
c.将视图空间的射线转换为世界空间的射线。
d.将模型空间或本地空间的模型或物体顶点位置转换到世界空间。
e.遍历模型中每个三角形以找出和射线相交的三角形。(在D3D10中可通过网格接口提供的一个方法来跳过该步骤)。
1.获取屏幕空间的鼠标位置
调用两个函数来获取屏幕空间的鼠标位置:GetCursorPos()和ScreenToClient()。它们将鼠标的x和y位置存储进一个类型为POINT的变量中。该变量就表示鼠标的位置,且是以像素为单位衡量的,在这将客户窗口的左上角位置表示为(0,0),右下角为(clientWidth,clientHeight)。随后再将x和y坐标传到另外一个函数,该函数会将坐标值转换为视图空间射线的3D向量值,然后再将视图空间的3D射线转换为世界空间的3D射线。
2.将2D屏幕空间射线转换为3D视图空间射线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值