gpt4 book ai didi

c# - .NET 高级图形库

转载 作者:太空狗 更新时间:2023-10-29 21:24:53 27 4
gpt4 key购买 nike

我正在用 C#/.NET 编写各种仿真工具

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

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

基本上,我正在寻找像 blitzbasic 这样的语言曾经提供的功能。那真的存在吗?

最佳答案

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

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

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

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com