【问题标题】:Wireframe rendering in WPFWPF 中的线框渲染
【发布时间】:2015-07-10 11:30:48
【问题描述】:

我必须在一个大型 WPF 应用程序中编写一个线框 3D 渲染器,它可以做很多事情但是 WPF 没有本机能力来做到这一点。

有些人使用微软的“3D Tools for WPF”,特别是它的 ScreenSpaceLines3D 类。但是在网络上,有人抱怨该类的性能缓慢和各种错误,而且该类库似乎自 2007 年以来就没有维护过!

其他人建议使用 Helix 3D 工具包中的 LinesVisual3D 类,但显然这也有问题 (http://helixtoolkit.codeplex.com/workitem/9957)

Charles Petzold 有一个 3D 库 - 有人知道它相当强大吗?

那么我在这里有什么好的选择吗?例如,有没有在 WPF 窗口中做 OpenGL3D 的好方法?是否有其他优秀的 WPF 库可以可靠地做到这一点?

提前致谢。

【问题讨论】:

  • 如果它在书中,Petzold 的东西往往是为了可读性而不是性能而设计的。不过,如果实施起来不需要太多工作,那么可能值得一试。
  • 这是一个尴尬的权衡 - WPF 3D 没有完全烘焙,缺乏点/线支持非常可悲。但是 WPF 3D 与您的 WPF 应用程序的其余部分集成得非常好,您可以使用许多相同的模式,并且您至少停留在一个“世界”中。如果您使用 WPF 3D,强烈建议您使用 Helix 3D 工具包。

标签: wpf 3d


【解决方案1】:

查看 SlimDX。 XNA 和托管 DirectX 等已弃用或过时。可能还检查 SharpDX 我有一段时间没有检查它。我们在 .NET 中将 SlimDX 用于 DirectX,这很好。您可能正在寻找的是使用 SlimDX 在 D3DImage 上呈现 WPF 互操作。另一种可能的选择是使用托管的 WinForms 控件并使用它的句柄与 DirectX 与 SlimDX 进行互操作,这可能会更快,但您会失去与 WPF 渲染引擎等更容易的互操作。如果您使用 D3DImage,它会变成您可以使用的 ImageBrush设置为任何东西的背景,您不必担心空域问题等。

编辑:哦,是的,由于某种原因,SlimDX 不再有他们的示例下载,但如果你下载它,他们的源代码就有示例。

【讨论】:

  • 这看起来 SlimDX 有潜力 - 我需要了解我是否可以利用 WPF 的视图空间和内置转换,或者它是否更像是在某种 WPF 窗口中运行的单独应用程序
  • 我相信,如果您使用 D3DImage,您可以像处理平面位图图像一样“转换”它。例如,您可以将其倾斜到一侧。但是,您确实拥有 DirectX 的全部功能来进行 3D 变换矩阵等。我们正在这样做例如旋转 3d 模型和进行照明等。为了澄清,您可以使用 DirectX 创建一个3D 透视图,但是一旦它在 WPF 中就变成了图片。您可以对其进行缩放或转换,但它不像在场景中旋转模型,要做到这一点,您必须使用 DirectX 通过 SlimDX 来完成,这是可能的
  • 请务必查看空域限制以及 DirectX、Win32 和 WPF 互操作。这里有一些与您通过 WPF 中的 D3DImage 类进行互操作的选择有关的影响。它并不像听起来那么糟糕......但基本上用户输入不能通过不同的技术相互嵌套。如果您单击鼠标,其中一项技术将像一个黑洞,可以捕获屏幕该区域的输入。对我来说,这没关系,因为我总是可以处理该技术的输入。 (WinForms)。 D3DImage 将允许它与 WPF 集成,但性能会受到一些影响。
  • 另外,您可能已经注意到,WPF 是一个保留的图形系统,它不擅长渲染成千上万个频繁变化的对象。例如,我们必须渲染由每秒变化多次的数千或数百万个点组成的线图。为此,GDI 会比 WPF 更好,但 DirectX 最适合我们。
【解决方案2】:

This page 似乎有关于使用 OpenGL 的信息。微软还提到了使用 Direct3d 和 XNA。 XNA 非常易于使用,如果您已经了解 OpenGL,那么学习 Direct3d 可能不会有太大问题。我承认,当我学习 Direct3d 时,它上面的材质不如 OpenGL 材质。

【讨论】:

  • 是的,但我对 OpenGL 的问题是与我现有的 WPF 代码库集成有多容易?您能否就问题的这方面发表评论?
【解决方案3】:

我看到很多回复都提到了这个问题的 3rd 方解决方案。

对于纯 WPF 解决方案,我从现有的 Model3D 创建了一个新的 Model3D,其中创建的每个方面都带有一个孔。即分成 6 个新面,每条“线”的宽度与原始面大小成正比。

这样做的原因是它看起来比固定线宽更好,但如果需要,您可以使用固定线宽。

可选择将中心孔填充为黑色的新刻面(组中的单独 Model3D),并且您已移除隐藏线。

对于刻面中的三个点A0、B0和C0,计算AB、AC和BC的中点。新点 A1 是沿 BC 线的 1/20。对接下来的两个点 B1 和 C1 重复此操作。

“线条”的 6 个新面由以下组合表示:

A0、B0、B1
A0, B1, A1
A0、C1、C0
A0、A1、C1
B0、C0、C1
B0、C1、B1

将 A1、B1 和 C1 添加到另一个模型以用于隐藏线移除变体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 2014-03-21
    • 2010-12-21
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多