WPF:查找部分位于2D矩形内的3D视觉效果

时间:2011-04-27 07:31:37

标签: c# wpf

我正在制作一个WPF程序,可以在3D中以图形方式修改数据。为了给用户提供同时选择多个图形对象的选项,我想实现一个选择矩形。 (就像在Windows资源管理器中一样。)像这样的程序中的一个常见功能是为选择矩形提供2个不同的功能,用户可以选择使用哪种方法。

  1. 选择部分或完全位于矩形内的任何对象。
  2. 仅选择完全位于矩形内的对象。
  3. 第二种方法是直接使用每个对象的边界框,并检查它是否在矩形内。另一方面,第一个似乎是相当一些工作。我的所有图形对象都是复杂的3D图形,并且可以由用户以任何方式旋转。目前我找不到任何其他方法,除了检查任何物体的网格中的任何三角形是否穿过我的2D矩形,这可能非常耗时。

    我对WPF 3D没什么经验,但我之前在OpenGL中做过这个。然后我可以告诉OpenGL绘制屏幕的特定区域,并收集在特定区域中可见的对象列表。我需要获得我想要的功能大约是5行代码。

    我想我的问题是:

    1. 有没有办法用WPF 3D做这个,类似于OpenGL方法?
    2. 如果没有,是否还有其他智能方法可以在视口中找到部分位于2D矩形后面的所有对象(Visual3D)?
    3. 我拒绝相信我是唯一一个有这种问题的人,所以我希望一个聪明的头脑可以指引我朝着正确的方向前进。

      此致 斯维尔


      感谢您的回答!

      2D矩形位于相机前方并向前无限延伸。我希望得到任何部分或完全在平截头体内的物体。

      我们使用的相机是正投影或透视投影相机(System.Windows.Media.Media3D.ProjectionCamera)。我们不使用矩阵相机的原因是我们使用的是不支持矩阵相机的第三方工具。但我确信有一种方法可以从投影相机中获取矩阵,所以希望不是问题。

      理论上你的解决方案听起来就像我们需要的那样,但我不知道如何继续。你有任何示例代码的链接,或者你能提供一些关于如何实际实现这个的更多提示吗?

      顺便说一下:由于我们正在使用WPF,因此我们无法直接访问DirectX。至少这是我们在一些研究后得出的结论。你提到使用z-buffer,我们无法通过WPF访问它。如果你知道一种访问z-buffer的方法,我们非常感谢!这是主题,但我们一直在努力禁用z缓冲区,但已经放弃......

      祝你好运, 斯维尔

2 个答案:

答案 0 :(得分:1)

您的交叉区域是2d矩形还是基于2d矩形的frustrum并且向前无限延伸(或者可能是某些限幅)?如果它可以被视为观看截头,那么您可以利用图形系统的现有功能,使用与您的原始矩形对应的相机视图和投影渲染场景,禁用所有光照和阴影,并专门选择颜色为'标记'场景中的不同对象。这意味着您可以使用图形硬件将剪切/投影作为“渲染”操作执行,然后简单地将像素值枚举为“标记”以确定矩形视图中存在的对象。

如果您需要将选择限制为实际的2d切片(或非常浅的截头),您可以使用Z缓冲区(如果可以访问它)来排除超出Z范围的标记像素期望的选择截止日。

这种方法的好处在于您可能已经拥有了Camera矩阵(它与用于选择窗口的矩阵相同),只需要将Projection矩阵更改为查看窗口的子集。 / p>

答案 1 :(得分:0)

'智能'方式是使用Camera's matrix

将矩形转换为方框

然后做所有对象和盒子的交集。