【问题标题】:What 3D rendering technic/algorithm is most effective to draw beams by edges?哪种 3D 渲染技术/算法最有效地通过边缘绘制光束?
【发布时间】:2016-09-19 14:14:02
【问题描述】:

我正在尝试用 C# 构建一个程序,该程序生成由梁组成的结构的 3D 模型,然后创建对象的一些视图(正面、侧面、顶部和等距)。

由于我不需要绘制曲面(边缘就足够了),我一直在计算要绘制的每条线,然后用

GraphicObject.DrawLine(myPen, x1, y1, x2, y2)

到目前为止,这工作得很好,但是当我向结构中添加部分时,GraphicObject 的刷新需要太多时间。所以我开始进行线条可见性检查以减少要绘制的线条数量。

我已经搜索了 Wikipedia 和一些关于该主题的 PDF,但我发现的都是表面。所以我的问题是:是否有一种简化的算法来检查物体边缘的可见性,还是我应该采用不同的方法,比如考虑表面?

任何建议将不胜感激,感谢您的帮助。

补充说明/问题:

我目前的做法:

  • 计算局部轴上的每个光束(所有顶点)

    • => 将它们移动到它们的全局位置
    • => 创建一个包含点对的列表(投影并缩放到视图)
    • => GraphicObject.DrawLine 点对列表)
  • 如果我按像素计算视图而不是使用DrawLine 方法,整个事情会更快吗?

屏幕截图显示了它将要执行的结构类型(尚未完全完成):

  • 结构视图

  • 结构细节

【问题讨论】:

    标签: c# algorithm 3d render


    【解决方案1】:

    有两种解决方案可以提高性能。 a) 将计算切换到显卡。 b) 使用 kd-tree 或其他类似的数据结构来快速去除不可见的边缘。

    这里有更多细节: 对于 a),你们中的许多计算都是将许多顶点(长度为 3 的向量)乘以某个矩阵。 CPU 很慢,因为它们一次只执行几个这样的操作。切换到 GPU,例如使用 CUDA,这将允许您以更好的内存访问基础设施并行执行它们。您还可以使用 OpenGL/DirectX/Vulkan 或其他任何东西来渲染线条本身,从而跳过必须从显卡获取结果以及 Windows 代码/库引入的任何其他问题。这将有助于在几乎所有情况下提高性能。

    对于 b),它仅在您不查看整个场景时才有帮助(在这种情况下,您确实需要绘制所有内容)。在这种情况下,您可以将场景存储在 kd-tree 或其他一些数据结构中,并使用它来快速删除肯定在视图区域之外的东西。您通常需要将一些长方体与金字塔/平锥相交,这样会涉及到更多的数学运算。

    作为一种折衷方案,在您想要查看所有内容的大型场景中应该有所帮助,您可以考虑调整细节级别。从您的示例中,读取的 bean 由 8 个左右的组件组成。如果你足够远,你将无法区分 8,所以只画一个。如果您有大量圆边,这将非常有用,因为您可以简化很多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多