WPF中的线框渲染

7

我需要在一个庞大的WPF应用程序中编写一个线框3D渲染器,但WPF本身并没有这个功能。

有些人使用微软的“WPF 3D工具”,特别是它的ScreenSpaceLines3D类。但是网上有人抱怨这个类的性能较慢,并且存在各种错误,而且这个类库似乎自2007年以来就没有得到维护了。

其他人建议使用Helix 3D工具包中的LinesVisual3D类,但据说这也有错误(http://helixtoolkit.codeplex.com/workitem/9957)。

Charles Petzold有一个3D库 - 有人知道它是否足够强大可靠吗?

那么我有什么好的选择呢?例如,在WPF窗口中是否有一种良好的方式可以执行OpenGL 3D操作?还有其他可靠实现这个功能的WPF库吗?

提前致谢。


如果是书籍中的话,Petzold 的东西往往更注重可读性而非性能。不过,如果实现起来不需要花费太多力气,那么尝试一下也许是值得的。 - Joe Plante
这是一个尴尬的权衡 - WPF 3D并不完全成熟,缺乏点/线支持非常令人遗憾。但是WPF 3D与您的WPF应用程序的其余部分非常好地集成在一起,您可以使用许多相同的模式,并且至少保持在一个“世界”中。如果您正在使用WPF 3D,则强烈推荐使用Helix 3D Toolkit。 - Govert
3个回答

3
请查看SlimDX。XNA和Managed DirectX等已被弃用或陈旧。可能还要检查SharpDX,我有一段时间没有检查过了。我们在.NET中使用SlimDX进行DirectX,并且效果很好。您可能正在考虑使用SlimDX在D3DImage上进行呈现,以进行WPF互操作。另一个可能的选择是使用托管的WinForms控件,并使用该控件的句柄与DirectX进行互操作,这可能会更快,但您会失去一些与WPF呈现引擎的简单互操作性。如果您使用D3DImage,则它将成为可以设置为任何背景的ImageBrush,并且您不必担心空域问题等。
编辑:哦,是的,由于某种原因,SlimDX不再在下载中提供示例,但如果您下载其源代码,则可以获得示例。

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

2

这个页面似乎提供了使用OpenGL的相关信息。微软也提到使用Direct3d和XNA。XNA非常易于使用,如果您已经熟悉OpenGL,学习Direct3d可能不会有太多问题。但我承认,当我学习Direct3d时,它的资料并不像OpenGL的资料那样好。


是的,但我关于OpenGL的问题是它与我的现有WPF代码库集成有多容易?您能否就这个问题发表评论? - user316117

0

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

对于一个纯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添加到另一个模型中,用于隐藏线消除变体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接