.NET高级图形库

时间:2011-02-03 15:54:58

标签: c# 3d data-visualization

我在C#/ .NET中编写各种模拟工具

我正在寻找的是一个高级可视化库;使用带有一些标准控件的相机创建一个场景,并为其渲染一些数千个球体或一些线框。那种事。如果初始化上下文需要不止一行,那么它就不符合我的理想。

我看过slimDX,但它的方式低于我寻找的水平(至少记录的部分,但我真的不关心任何其他)。 WPF透视看起来很酷,但它似乎针对静态XAML定义的场景,而且这也不适合我。

基本上,我正在寻找像blitzbasic这样的特色语言。这根本存在吗?

4 个答案:

答案 0 :(得分:3)

也许XNA Game studio正是您所寻找的。

另请查看DirectX

答案 1 :(得分:3)

  

WPF透视看起来很酷,但它似乎针对静态XAML定义的场景

再看一下,WPF可以像你需要的那样动态。

您可以完全不使用XAML编写任何WPF程序,包括3D。

答案 2 :(得分:3)

我也对此感兴趣(因为我也在开发模拟工具)并最终在XNA中将一些东西混在一起。然而,这肯定比你描述的要多得多。请注意,您可以通过XAML在WPF中执行的任何操作也可以通过代码完成,因为XAML仅仅是对象层次结构及其关系的表示。我认为这可能是你最好的选择,虽然我没有任何关于你可以期望用几十万个球体表现出什么样的表现的指标(在这种情况下你绝对需要进行一些剔除而且剔除本身可能是如果不使用网格分区等优化,则会很昂贵。)


编辑:如果你真的需要支持100K实体并且它们都可以渲染为球体,我建议你完全绕过3d引擎,只使用XNA进行数学运算。我想象一下如下的方法:

  • 使用XNA设置Camera(View)和Perspective矩阵。它有一些方便的Matrix静态函数,使这很容易。

  • 计算投影矩阵并将所有“球体”原点投影到观看截头体。这将为您提供截止日期中的X,Y屏幕坐标和Z深度。您可以将其表示为100K单个矩阵乘法或将投影矩阵乘以单个3 x 100K元素矩阵。在前一种情况下,这是使用新的.NET 4 Parallel功能并行的很好的候选者。

  • 如果您发现100K矩阵乘法是一个问题,如果您知道在给定时间只能看到它们中的一小部分,则可以通过在变换前执行剔除来显着减少这一点。例如,您可以反转Projection矩阵以在原始空间中找到截头体的边界,并为截头体创建一个轴对齐的边界框。然后,您可以排除此框外的所有点(X,Y和Z中的简单比较测试。)您只需在Projection矩阵更改时重新计算此边界框,因此如果它不经常更改,则这可以是合理的优化。

  • 获得变换点后,剪切平截头体外的任何一个(Z <0,Z> maxDist,X <0,Y <0,X&gt;宽度,Y&gt;高度)。您现在可以通过绘制一个填充圆来渲染每个点,其半径与Z成比例(Z = 0将具有最大半径,Z = maxDist可能会淡化为单个点。)如果您想提供阴影/深度感,您可以使用阴影刷渲染,以非常松散地模拟球体上的光照。这是有效的,因为你场景中的所有东西都是一个球体,你可能不会担心像阴影这样的东西。所有这些在WPF(包括着色画笔)中都相当容易,但一定要使用DrawingVisual类而不是框架元素。此外,您需要确保以正确的Z顺序绘制,因此如果将转换后的点存储在添加时进行排序的数据结构中,则会有所帮助。

  • 如果您仍然遇到性能问题,可以进一步优化。例如,如果您知道只有一部分点在移动,则可以缓存转换后的固定点位置。这实际上取决于数据集的性质及其演变方式。

  • 由于您的数据集太大,您可以考虑更改可视化方式。不是渲染100K点,而是将工作空间划分为体积网格,并记录每个网格立方体内点的数量(密度)。您可以仅投影网格的中心并将其渲染为具有一些额外反馈(如颜色,不透明度或笔刷纹理)的“球体”以指示点密度。您可以将此技术与传统渲染方法相结合,将近点渲染为“球体”,将远点渲染为“群集”对象,并使用一些画笔图案来匹配密度。一种简单的算法是考虑相机周围的边界球;球体内的所有点都将正常转换;在球体之外,您将仅使用密度网格进行渲染。

答案 3 :(得分:-1)

您是否必须使用C#/ .Net或MonoDevelop是否足够好?如果你想要一个强大的3D引擎,我可以推荐http://unity3d.com/