【发布时间】:2010-11-06 04:47:27
【问题描述】:
好的,当我以前使用 gdi+ 绘制东西时,我曾经知道对象的坐标,但现在当我在 directx 9 中使用网格时,我不知道如何获取对象的坐标,因此我可以找到鼠标是否悬停在目的。知道如何找到坐标吗?
【问题讨论】:
标签: c++ winapi visual-c++ directx
好的,当我以前使用 gdi+ 绘制东西时,我曾经知道对象的坐标,但现在当我在 directx 9 中使用网格时,我不知道如何获取对象的坐标,因此我可以找到鼠标是否悬停在目的。知道如何找到坐标吗?
【问题讨论】:
标签: c++ winapi visual-c++ directx
您需要将鼠标位置投射到世界中并将其转换为世界空间坐标,然后针对各种对象进行测试。您也许可以找到一个库来为您执行此操作,我知道 OpenGL 支持拾取,并且大多数包装器都为此提供了增强功能,但原则是:
在窗口中查找鼠标坐标。使用这些坐标,向世界投射一条射线(无论您是在系统中实际使用射线还是简单地进行类似的数学运算都不是什么大问题)。您将使用当前视图矩阵(“相机”角度和位置)来计算光线的方向和原点。使用该射线,测试您的对象、它们的边界框或几何体(无论您选择哪个)以找到对象。使用交点坐标,找到位于该位置的对象。
如果您的场景相对静态,您也可以非常轻松地为此使用深度缓冲区。只需将深度纹理设置为 Z 缓冲区进行渲染,然后使用深度、鼠标位置和视图矩阵来找到交点。
可以反过来执行此操作,即将每个对象映射到适当的屏幕坐标,但您可能会遇到深度排序和重叠区域的问题。此外,将每个对象映射到每一帧的窗口区域可能会不必要地缓慢。
【讨论】: