繁体   English   中英

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

[英]WPF: Finding 3D-visuals that are partially inside a 2D rectangle

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

  1. 任何部分或完全位于矩形内的 object 都会被选中。
  2. 仅选择完全位于矩形内的对象。

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

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

我想我的问题是这样的:

  1. 有没有办法用 WPF 3D 来做到这一点,类似于 OpenGL 方法?
  2. 如果没有,是否有任何其他智能方法可以在部分位于 2D 矩形后面的视口中查找所有对象(Visual3D)?

我拒绝相信我是唯一一个有这种问题的人,所以我希望聪明的头脑能给我指明正确的方向。

问候, 斯韦雷


谢谢您的回答!

二维矩形就在相机的前面,并无限向前延伸。 我想获得部分或完全位于该截锥体内的任何 object。

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

从理论上讲,您的解决方案听起来正是我们所需要的,但我不确定如何进行。 您是否有任何指向示例代码的链接,或者您能否就如何实际实现这一点提供更多提示?

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

最好的问候, 斯韦雷

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

如果您需要将选择限制为实际的 2d 切片(或非常浅的平截头体),您可以使用 Z 缓冲区(如果可以访问它)来排除在所需选择平截头体的 Z 范围之外的标记像素.

这种方法的好处是您可能已经有了相机矩阵(它与用于选择的 window 的矩阵相同)并且只需将投影矩阵更改为查看 window 的子集。

一种“聪明”的方法是使用相机的矩阵将矩形转换为一个盒子

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM