DirectX11-鼠标拾取

鼠标拾取

背景

屏幕中选中一点P(x,y),需要计算在三维场景中选中了那个物体或者说哪些物体。

方法

此时需要计算点P(x,y) 对应三维空间中的哪个点,或者哪些点。(此时注意,屏幕空间中的点也有z值,一般我们设置为z = 0,比如P(x,y,0) ,映射到世界坐标系中的点将在近平面上。z 值不同,将会映射到三维空间中的不同的点*(x,y,z)* 都可能不相同,不仅仅是z值。
具体映射方法也很简单,就是从视口逆变换->投影逆变换->观察逆变换,将屏幕中的点P(x,y,z) 投射到三维空间中,得到P’(x,y,z),然后P’ 和相机的位置C 形成射线CP’,该射线将会和物体进行碰撞检测。从而判断选中了哪些物体。具体的计算过程可参考D3D教程-鼠标拾取
在此补充:逆向变换的计算,DirectXMath 提供了现有的接口

XMVECTOR XM_CALLCONV XMVector3Unproject(
  [in] FXMVECTOR V,
  [in] float     ViewportX,
  [in] float     ViewportY,
  [in] float     ViewportWidth,
  [in] float     ViewportHeight,
  [in] float     ViewportMinZ,
  [in] float     ViewportMaxZ,
  [in] FXMMATRIX Projection,
  [in] CXMMATRIX View,
  [in] CXMMATRIX World
) noexcept;

你可能感兴趣的:(DirectX,11,鼠标拾取)