Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪种3D渲染技术/算法最有效地通过边绘制光束?_C#_Algorithm_3d_Render - Fatal编程技术网

C# 哪种3D渲染技术/算法最有效地通过边绘制光束?

C# 哪种3D渲染技术/算法最有效地通过边绘制光束?,c#,algorithm,3d,render,C#,Algorithm,3d,Render,我正在尝试用C#构建一个程序,生成由梁组成的结构的3D模型,然后创建对象的一些视图(正面、侧面、顶部和等轴测) 由于我不需要绘制曲面(边就足够了),所以我一直在计算要绘制的每条线,然后使用 GraphicObject.DrawLine(myPen, x1, y1, x2, y2) 到目前为止,这一切都很好,但随着我向结构中添加部件,刷新GraphicObject需要花费太多时间。所以我开始进行线条可见性检查,以减少要绘制的线条数量 我在维基百科和一些PDF上搜索过这个主题,但我所找到的都是面向

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

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

GraphicObject.DrawLine(myPen, x1, y1, x2, y2)
到目前为止,这一切都很好,但随着我向结构中添加部件,刷新
GraphicObject
需要花费太多时间。所以我开始进行线条可见性检查,以减少要绘制的线条数量

我在维基百科和一些PDF上搜索过这个主题,但我所找到的都是面向表面的。所以我的问题是:是否有一个简化的算法来检查对象边缘的可见性,或者我应该采用另一种方法,比如考虑曲面?

如果您有任何建议,我们将不胜感激,谢谢您的帮助

补充说明/问题:

我目前的做法是:

  • 计算局部轴中的每个梁(所有顶点)

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

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

  • 结构视图

  • 结构细节

有两种解决方案可提高性能。 a) 将计算切换到图形卡。 b) 使用kd树或其他类似的数据结构快速删除不可见的边

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

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

作为一个妥协,在一个大的场景中你应该帮助你看到一切,你可以考虑调整细节的水平。在您的示例中,整个读取bean由8个左右的组件组成。如果你够远,你将无法分辨8,所以只画一个。如果您有大量的圆角,这将非常有用,因为您可以简化很多圆角