我正在C#/。NET中编程各种仿真工具

我正在寻找的是一个高级可视化库;使用带有一些标准控件的相机来创建一个场景,并为其渲染几千个球体或一些线框。那种事如果初始化上下文需要花费多行,那将偏离我的理想。

我已经看过slimDX,但是它的水平要比我正在寻找的低(至少已记录的零件,但我真的不在乎其他任何零件)。 WPF透视图看起来很酷,但是它似乎是针对静态XAML定义的场景,这也不适合我。

基本上,即时通讯正在寻找像blitzbasic这样的语言提供的功能。真的存在吗?

最佳答案

我对此也很感兴趣(因为我也在开发仿真工具),最终在XNA中一起破解了一些东西。但是,肯定比您描述的要多得多的工作。请注意,通过XAML在WPF中可以执行的任何操作也可以通过代码完成,因为XAML只是对象层次结构及其关系的表示。我认为这可能是您最好的选择,尽管我没有任何指标可以衡量在几十万个领域中预期的性能(在这种情况下,您绝对需要进行淘汰,而淘汰本身可能是如果您不使用网格划分之类的优化方法,则价格会很高。)

编辑:如果您确实需要支持10万个实体,并且它们都可以呈现为球体,我建议您完全绕过3d引擎,并且仅将XNA用于数学。我可以想象这样的方法:

  • 使用XNA设置“相机( View )”和“透视图”矩阵。它具有一些方便的Matrix静态函数,可简化此过程。
  • 计算投影矩阵,并将所有“球”原点投影到视锥上。这将为您提供X,Y屏幕坐标和截锥体中的Z深度。您可以将其表示为100K单个矩阵乘法,也可以表示为Projection矩阵与单个3 x 100K元素矩阵的乘法。在前一种情况下,这是使用新的.NET 4并行功能进行并行处理的理想选择。
  • 如果发现100K矩阵乘法是一个问题,则可以通过在变换之前执行点的剔除来显着减少此问题,前提是您知道在给定的时间只有一小部分可见。例如,您可以反转Projection矩阵以在原始空间中找到视锥的边界,并为视锥创建一个与轴对齐的边界框。然后,您可以排除此框外的所有点(在X,Y和Z中进行简单的比较测试。)仅在Projection矩阵更改时才需要重新计算此边界框,因此,如果它不经常更改,则可以认为是合理的优化。
  • 变换了点之后,剪切掉视锥体之外的所有内容(Z maxDist,X 宽度,Y>高度)。现在,您可以通过绘制一个实心圆来渲染每个点,其半径与Z成正比(Z = 0将具有最大半径,Z = maxDist可能会淡入单个点。)如果要提供阴影/深度感,您可以使用阴影笔刷进行渲染,以非常宽松地模拟球体上的光照。之所以可行,是因为您场景中的所有内容都是一个球体,并且您大概不必担心诸如阴影之类的事情。在WPF中(包括“阴影笔刷”),所有这些操作都相当容易,但是请确保使用DrawingVisual类而不是框架元素。另外,还需要确保按正确的Z顺序绘制,因此如果将转换后的点存储在按添加顺序排序的数据结构中,这将很有帮助。
  • 如果您仍然遇到性能问题,则可以进行进一步的优化。例如,如果您知道只有一部分点在移动,则可以为不动点缓存已转换的位置。这实际上取决于您的数据集的性质及其演变方式。
  • 由于您的数据集非常大,因此您可以考虑更改其可视化方式。无需渲染100K点,而是将工作空间划分为体积网格并记录每个网格立方体内的点数(密度)。您可以仅投影网格的中心,并将其渲染为“球体”,并带有一些其他反馈(例如颜色,不透明度或笔刷纹理)以指示点密度。您可以将此技术与传统的渲染方法结合起来,通过使用一些笔刷图案将近点渲染为“球体”,将远点渲染为“集群”对象以匹配密度。一种简单的算法是考虑相机周围的边界球;球体内的所有点都将正常变换;超出球体范围时,将仅使用密度网格进行渲染。
  • 10-05 22:34