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

标签 c# wpf

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

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

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

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

我想我的问题是这样的:

  1. 有没有一种方法可以使用 WPF 3D 执行此操作,类似于 OpenGL 方法?
  2. 如果不是,是否有任何其他智能方法可以在部分位于 2D 矩形后面的视口(viewport)中找到所有对象 (Visual3D)?

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

问候, 斯维尔


谢谢您的回答!

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

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

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

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

最好的问候, 斯维尔

最佳答案

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

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

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

关于c# - WPF:查找部分位于 2D 矩形内的 3D 视觉效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5800804/

相关文章:

c# - 使用最小起订量模拟代表 "Wrapper"

c# - 如何修复 'No property or field exists in type' 错误?

wpf - 将性别表正常化是否太过分了?

wpf - 在WPF(或WinForms)中播放rtsp流

c# - 如何在没有 C/C++ 的情况下在 C# 中修饰代码——比如宏

C# ProcessStartInfo 读取输出 "live"(并发)

c# - 从部分 View 单击按钮重定向到父操作方法

c# - WPF画笔颜色从win10到win8平板电脑发生变化

c# - 在 WPF Datagrid 中将动态图像设置为自动生成的列

c# - 提高 WPF 列表框的绘制速度